2011-07-18 16 views
2

sqlite3に対して「INSERT OR REPLACE」コマンドを実行するたびに、実際に既存のエントリを上書きするのではなく、重複するエントリが作成されます。INSERTまたはREPLACEが重複を作成しています

私は、次のコマンドを使用して、sqlite3の中にテーブルを作成しました:

CREATE TABLE mytable (a INTEGER PRIMARY KEY, b VARCHAR(50), c BOOLEAN, d BOOLEAN, e INTEGER, f TEXT, g TEXT, h INTEGER, i DATETIME); 

そして、私はこれを実行している:

$database = new POD("sqlite:mydatabase.db"); 
$database->prepare("INSERT OR REPLACE INTO mytable (b, c, d, e, f, h, h, i) values(?, ?, ?, ?, ?, ?, ?, ?)") 
$database->execute('test', 0, 1, -1, 'test', 'test', 12, strtotime('now')); 

私が間違ってやって何ができますか?ありがとう

+1

をそれは右、REPACE REPLACEないと言うのですか?そしてexecuteメソッド呼び出しにかっこがありません。 –

+0

はい、REPLACEと言っていて、かっこがあります。私はコピーして貼り付けていたはずです;) – Sam

+1

クエリに主キー 'a'が含まれていないので、SQLiteはこのデータが新しいデータではないことをどのように知っていますか? –

答えて

6

あなたは「`一意である必要があります列の何セットごcreate文で指定する必要があります - 今、例えば

CREATE TABLE mytable (a INTEGER PRIMARY KEY, b VARCHAR(50), c BOOLEAN, d BOOLEAN, 
         e INTEGER, f TEXT, g TEXT, h INTEGER, i DATETIME, 
         UNIQUE (b,c)); 

sqlite> insert or replace into mytable (b,c,d,e,f,g,h,i) values ('foo',1,1,2,'bar','baz',3,'2011-07-19'); 
sqlite> select * from mytable; 
2|foo|1|1|2|bar|baz|3|2011-07-19 
sqlite> insert or replace into mytable (b,c,d,e,f,g,h,i) values ('foo',1,1,2,'bar','baz',4,'2011-07-19'); 
sqlite> select * from mytable; 
3|foo|1|1|2|bar|baz|4|2011-07-19 
sqlite> 
1

しないでください。 PKを指定する必要があります。

最初にINSERTを実行し、次にUPDATEを実行します。

関連する問題