SQLite语句INSERT OR REPLACE INTO
将替换行,如果它已经存在。但是当我一次又一次地运行相同的语句时,它会一直插入而不是替换。SQLite语句INSERT OR REPLACE INTO not clear to me
REPLACE实际发生在什么情况下?
INSERT OR REPLACE INTO names (rollno, name) VALUES (1, "Adam")
SQLite语句INSERT OR REPLACE INTO
将替换行,如果它已经存在。但是当我一次又一次地运行相同的语句时,它会一直插入而不是替换。SQLite语句INSERT OR REPLACE INTO not clear to me
REPLACE实际发生在什么情况下?
INSERT OR REPLACE INTO names (rollno, name) VALUES (1, "Adam")
如果要插入的行与表中的另一个PRIMARY KEY具有相同的PRIMARY KEY,则会发生替换。 你可能忘了定义一个主键。
哈哈哈,哦,男人我从哪里开始?
我在通过这个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!
值将在某行更换如果发生UNIQUE
违规行为,如documentation解释:
当一个UNIQUE限制冲突发生时,替换算法 删除预先存在-行,也引起在插入或更新当前行之前约束冲突 以及命令 继续正常执行。如果发生NOT NULL约束冲突 ,REPLACE冲突解决方法会将NULL值替换为该列的默认值,或者如果该列没有默认值 ,则使用ABORT算法。如果发生CHECK约束 冲突,则REPLACE冲突解决算法总是 的工作方式与ABORT类似。
我推测您要制作的列UNIQUE
是rollno
。您可以通过将其设置为表格的PRIMARY KEY
或通过简单地在其上创建UNIQUE
constrain来使其变得独特。
或者有一个主键是自动增量('id'或其他),你不在你的查询中。它会得到一个新的'id',所以它永远不会重复。 – Nanne