0

ステートメントが機能しないのはなぜですかON DUPLICATE KEY UPDATE。テーブルに重複がないようにする方法を探しています。以下のコードでは、重複が発生します

CMS::insertQuery("INSERT INTO {table} SET canid=?, categoryid=? ON DUPLICATE KEY UPDATE canid=?, categoryid=?", array($emailCheck['id'], $id, $emailCheck['id'], $id));

DB:

CREATE TABLE `table` (  `canid` int(10) NOT NULL,  `categoryid` int(10) NOT NULL,  UNIQUE KEY `canid` (`canid`,`categoryid`)) ENGINE=MyISAM DEFAULT CHARSET=latin1

実行しようとしている現在の行:

CMS::insertQuery("INSERT INTO {table} SET canid=?, categoryid=? ON DUPLICATE KEY UPDATE canid=?, categoryid=? WHERE canid=?, categoryid=?", array($emailCheck['id'], $id, $emailCheck['id'], $id,$emailCheck['id'],$id));
4

2 に答える 2

4

スキーマを提供していないため、これは単なる推測ですが、一意のキーの列の 1 つは null 可能ですか?

編集:

@G-Nugget がコメントで述べているように、問題の列には一意のキーが必要です。

ON DUPLICATE KEY UPDATE を指定し、UNIQUE インデックスまたは PRIMARY KEY で値の重複を引き起こす行が挿入された場合、MySQL は古い行の UPDATE を実行します。

http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

一意である必要がある列の組み合わせには、一意のキーが必要です。

例えば:

ALTER TABLE yourTable ADD UNIQUE KEY (`canid`, `categoryid`);

また、データベースに関する質問をするときはSHOW CREATE TABLE、問題のテーブルを含めてください。

于 2012-09-22T00:46:35.160 に答える
0

最初に注意すべきことは、重複を確認するフィールドはプライマリまたは一意である必要があるということです。私は同じ問題を抱えていて、今解決しました。

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

于 2014-08-16T04:06:04.117 に答える