-1

この更新を実行するスクリプトがあります。

UPDATE `Cq_Item` 
SET     `rfq_item_id` = '9',
    `value` = 'No Bid',
    `datetime_created` = '2012-10-23T20:54:42+00:00',
    `id` = '101' 
WHERE `id` = '101'

この表に対して:

CREATE TABLE IF NOT EXISTS `cq_item` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `rfq_item_id` mediumint(8) unsigned NOT NULL,
  `product_id_quoted` mediumint(8) unsigned DEFAULT NULL,
  `quantity` mediumint(6) unsigned DEFAULT '0',
  `value` float(10,4) NOT NULL,
  `datetime_created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rfq_item_id` (`rfq_item_id`,`product_id_quoted`,`quantity`,`value`),
  KEY `product_id` (`product_id_quoted`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=102 ;

そしてそれはこのエラーを投げています:

1062-キー「rfq_item_id」の重複エントリ「9-321742-1-0.0000」

確かに、私はSQLの第一人者ではありませんが、重複エラーをスローすることは、update私には直感的とは言えません。
なぜそのようなエラーがスローされるのINSERTかは理解していますが、これでそれを取得するために私が間違っていることを理解するためにいくつかの助けを使うことができますUPDATE:)

4

3 に答える 3

0

テーブル構造は、rfq_item_idが一意のキーであることを示しています。更新クエリで設定しようとしている値は、すでにテーブルにあります。rfq_item_idしたがって、クエリを='9'で更新することはできません。

于 2012-10-23T21:12:16.170 に答える
0

テーブルの説明に基づいて、次のようになりますunique key

UNIQUE KEY `rfq_item_id` (`rfq_item_id`,`product_id_quoted`,`quantity`,`value`)

UPDATEの基準をすでに満たしている値でを実行しようとしていますUNIQUE KEY

rfq_item_id = '9'とを含むレコードがすでにありvalue = 'No Bid'ます。一意キーの他の2つの列の値も、の値とすでに一致しています。id = '101'

于 2012-10-23T21:12:38.633 に答える
0

更新は、実際には2つの別々の操作(もちろん条件が満たされた場合)を実行します。1つはDELETE、次にINSERTです。おそらく、UPDATEによって、id = 101の行が、別の行にすでに配置されている一意のキーに違反していないことを確認する必要があります。

したがって、更新を試みる前に、このような2つの行があったとします。

id   |   rfq_item_id |   product_id_quoted  | quantity | value   | datetime_creates
100  |   9           |   9                  |    1     | 0.0000  | <some datetime>
101  |   10          |   9                  |    1     | 0.0000  | <some datetime>

rfq_item_id / product_id_quoted / amount / valueの一意キーは同じであるため、UPDATEは実行時に表示されている正確なエラーをスローします。

valueあなたの問題は、floatとして定義されているフィールドに「NoBid」の文字列値を設定しようとしていることに関連していると思います。したがって0.0000、更新で値を取得します。

また、元の質問へのコメントで述べたように、UPDATEステートメントのWHERE句で使用している主キーの値を「設定」しようとすることは、一般にSQLの不適切な方法と見なされます。これは、更新の一部として主キーを変更する理由が本当にない場合を除きます。

于 2012-10-23T21:17:20.230 に答える