UNIQUE制約違反が発生すると、REPLACEアルゴリズムは、現在の行を挿入または更新する前に制約違反の原因となっている既存の行を削除し、コマンドは正常に実行され続けます。これは、ROWIDを変化させると
create table b (c1 integer primary key, c2 text UNIQUE ON CONFLICT IGNORE);
とあなたから「または交換」条項を削除するには、次のように次のような問題
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
周りの作業は、C2列の定義を変更することで作成されます挿入物;第三の挿入後の変化の戻り値はあなたがルックアップする必要があるでしょう、あなたのアプリケーションに通知されます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
:テストは、あなたの挿入した後、あなたが実行するには、次のSQLが必要になり、その後
"test-1"のROWIDはすでにファイルに格納されていたためです。もちろん、これがマルチユーザーシステムの場合は、トランザクション内でこれをすべてラップする必要があります。
代わりに以下を使用します。これまでのエントリを壊すIDを変更すると、エラーによってROWIDが返されません。私は2つのステップでこれを行う必要があるように聞こえる?select文とinsert文が存在しない場合は –