Wenn eine UNIQUE-Constraint-Verletzung auftritt, löscht der REPLACE-Algorithmus bereits vorhandene Zeilen, die die Constraint-Verletzung verursachen, bevor die aktuelle Zeile eingefügt oder aktualisiert wird, und der Befehl wird normal ausgeführt. Dies bewirkt, dass die Rowid zu ändern und schafft das folgende Problem
Y:> **sqlite3 test**
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> **create table b (c1 integer primary key, c2 text UNIQUE);**
sqlite> **insert or replace into b values (null,'test-1');**
sqlite> **select last_insert_rowid();**
1
sqlite> **insert or replace into b values (null,'test-2');**
sqlite> **select last_insert_rowid();**
2
sqlite> **insert or replace into b values (null,'test-1');**
sqlite> **select last_insert_rowid();**
3
sqlite> **select * from b;**
2|test-2
3|test-1
Die Arbeit um ist die Definition der c2 Spalte zu ändern, wie
create table b (c1 integer primary key, c2 text UNIQUE ON CONFLICT IGNORE);
folgt und die „oder ersetzen“ Klausel zu entfernen aus Ihrem Einsätze;
dann, wenn Test nach dem Einsatz, müssen Sie die folgende SQL-auszuführen: select last_insert_rowid(), changes();
sqlite> **create table b (c1 integer primary key, c2 text UNIQUE ON CONFLICT IGNORE);**
sqlite> **insert into b values (null,'test-1');**
sqlite> **select last_insert_rowid(), changes();**
1|1
sqlite> **insert into b values (null,'test-2');**
sqlite> **select last_insert_rowid(), changes();**
2|1
sqlite> **insert into b values (null,'test-1');**
sqlite> **select last_insert_rowid(), changes();**
2|0
Der Rückgabewert der Änderungen nach dem dritten Einsatz wird eine Benachrichtigung an die Anwendung, die Sie benötigen, um Nachschlag das rowid von "test-1", da es bereits in der Datei war. Wenn es sich um ein Mehrbenutzersystem handelt, müssen Sie natürlich auch alles in eine Transaktion einbinden.
anstelle eines Fehlers ich möchte last_insert_rowid mir die ID (PK) des Textes geben. Bisher ersetzt Ersetzen die ID, die vorherige Einträge unterbricht, und ein Fehler gibt die Rowid nicht zurück. Es klingt, als müsste ich das in zwei Schritten tun?eine select-Anweisung dann eine insert-Anweisung, falls sie nicht existiert –