SQLite语句INSERT OR REPLACE INTO对我不清楚

时间:2012-08-30 07:37:29

标签: ios sqlite

如果该行已存在,则SQLite语句INSERT OR REPLACE INTO将替换该行。但是当我一次又一次地运行相同的语句时,它会继续插入而不是替换。

REPLACE实际上是在什么情况下发生的?

INSERT OR REPLACE INTO names (rollno, name) VALUES (1, "Adam")

3 个答案:

答案 0 :(得分:6)

如果要插入的行与表中的另一行具有相同的PRIMARY KEY,则会发生替换。 您可能忘了定义主键。

答案 1 :(得分:3)

如果UNIQUE违规发生,某些行中的值将被替换,如documentation中所述:

  

发生UNIQUE约束违规时,使用REPLACE算法   删除导致约束违规的预先存在的行   在插入或更新当前行和命令之前   继续正常执行。如果违反NOT NULL约束   发生时,REPLACE冲突解决方案用NULL替换NULL值   该列的默认值,或者列没有默认值   值,然后使用ABORT算法。如果是CHECK约束   发生违规,REPLACE冲突解决算法总是如此   就像ABORT一样。

我认为您要UNIQUE的列是rollno。您可以将其设为表格的PRIMARY KEY,或者只需在其上创建UNIQUE constrain即可使其独一无二。

答案 2 :(得分:1)

哈哈哈,噢,伙计我从哪里开始?

当我经历这个SQL地狱时,我正在诅​​咒电脑。

谢天谢地,我设法让它运转起来! :d

我通过INSERT OR REPLACE INTO语句学到的一件事是你需要做一件超级关键的事情:

Mark one column of your table as "UNIQUE" during SQL table creation.

以下是一个示例(滚动到右端):

NSString *strEvents = @"CREATE TABLE Events (eventid INTEGER PRIMARY KEY, nodeID INTEGER, title VARCHAR(255), description TEXT, eventTime VARCHAR(255), eventDate VARCHAR(255), eventLocation VARCHAR(255), imagePaths TEXT, bookingURL TEXT, UNIQUE(nodeID));";

在上面的示例中,我将“nodeID”列标记为唯一。

一旦你这样做,就可以这样使用它:

-(void)batchSaveEvents:(NSMutableArray *)paramList
{
    @synchronized(self)
    {
        if(self.isConnected == YES)
        {
            const char *sql = "INSERT OR REPLACE INTO Events (nodeID,title,description,eventTime,eventDate,eventLocation,imagePaths,bookingURL) VALUES (?,?,?,?,?,?,?,?);";

            sqlite3_stmt *stmtSave;

            if(sqlite3_prepare(objDatabase, sql, -1, &stmtSave, NULL) != SQLITE_OK)
            {
                //NSLog(@"FAILED %s", sqlite3_errmsg(objDatabase));

                return;
            }

            int listIndex = 0;        

            sqlite3_exec(objDatabase, "BEGIN IMMEDIATE TRANSACTION", 0, 0, 0); // Begin Trasaction

            for(listIndex = 0; listIndex < [paramList count]; listIndex++)
            {
                sqlite3_bind_int(stmtSave, 1, [[(Event *)[paramList objectAtIndex:listIndex] nodeID] intValue]);
                sqlite3_bind_text(stmtSave, 2, [[(Event *)[paramList objectAtIndex:listIndex] title] UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmtSave, 3, [[(Event *)[paramList objectAtIndex:listIndex] description] UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmtSave, 4, [[(Event *)[paramList objectAtIndex:listIndex] eventTime] UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmtSave, 5, [[(Event *)[paramList objectAtIndex:listIndex] eventDate] UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmtSave, 6, [[(Event *)[paramList objectAtIndex:listIndex] eventLocation] UTF8String], -1, SQLITE_TRANSIENT);

                sqlite3_bind_text(stmtSave, 7, [[(Event *)[paramList objectAtIndex:listIndex] imagePaths] UTF8String], -1, SQLITE_TRANSIENT);

                sqlite3_bind_text(stmtSave, 8, [[(Event *)[paramList objectAtIndex:listIndex] bookingURL] UTF8String], -1, SQLITE_TRANSIENT);

                sqlite3_step(stmtSave);
                sqlite3_reset(stmtSave);
            }

            sqlite3_exec(objDatabase, "COMMIT", 0, 0, 0); // Commit Transaction

            sqlite3_finalize(stmtSave);
        }
    }
}

祝你好运brudda! ......还是sista!