2011-09-28 17 views
1

上に挿入します。私は以下の使用してMySQLで重複キーの更新に挿入しようとしている重複した更新MySQLエラー

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, qqqq, 115, 0) ON DUPLICATE KEY 
UPDATE keyword=VALUES(qqqq), client_id=VALUES(115), desc_id=VALUES(0) 

をしかし、それは私にこのエラーを与える:

#1064 - You have an error in your SQL syntax; check the manual that 
     corresponds to your MySQL server version for the right syntax 
     to use near '115), desc_id=VALUES(0)' at line 1 

は理由がありますどうして?

答えて

6

クエリのUPDATE部分のVALUES "function"は、INSERT部分で使用した列名を参照します。あなたが望むのはこれです:

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY 
UPDATE keyword=VALUES(keyword), client_id=VALUES(client_id), desc_id=VALUES(desc_id); 

この方法では、挿入する値を参照することができます。それらは計算された値であっても、SELECTクエリからのものであってもよい。より複雑なクエリになると、これはあなたがしようとしていたものよりずっと便利だと思います。

あなたがDUPLICATE KEY UPDATE上で使用する場合の時間の大半は、あなたが挿入したいものは何でもの列の

UPDATE x=VALUES(x), y=VALUES(y), z=VALUES(z) 

以外の何かをする理由がないだろう。

実際に、さまざまな列に指定した値を挿入したい場合は、VALUES()を省略してください。あなたはちょうどこのようにそれを行うことができます:

INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id) 
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY 
UPDATE keyword='qqqq', client_id=115, desc_id=0 

しかし、これは二回、すべての値を入力する必要があり、あなたが文を変更するたびにあなたはすべてがアップ一致することを確認する必要があります。

エラーメッセージが示唆するように、それは、マニュアルを読むために損はない: http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

#1054作成だ
+0

- 「フィールドリスト」に不明な列「QQQQ」をエラー... – user952543

+0

'qqqq' =値をあなたは、COLUMNではなく、 – ajreal

+0

id、キーワード、client_id、desc_idは値であり、qqqqは値 – user952543