2

これは問題のあるクエリです (意図した意味: エンティティ 530 とペアになっているすべてのエンティティをペアの数と共に新しいテーブルにプルします)。

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

エラーメッセージを解釈します:

ERROR 1062 (23000): Duplicate entry '0' for key 1

主キーの一意性に違反しているという苦情として。ただし、一意性を確保する必要があるその値でグループ化していますよね? 次に、これを試してみようと思いました:

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
;
INSERT INTO paired
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

驚くべきことに、これは問題なく動作しますが、私の理解によれば、この 2 つは同等であるはずです。

何を与える?!?

参考のため:

mysql  Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1
4

1 に答える 1

4

あなたのステートメントは同等ではありません。CREATE ... SELECTステートメントの一部で言及した列CREATE(つまり、entity_id と numrels) を作成し、さらにSELECT、ステートメントの一部の各列の列を作成します。新しいテーブルには 4 つの列ができます。の結果がSELECT最後の 2 列に挿入されます。他の列にはデフォルト値が入力されるため、主キーの一意性に違反します。

http://dev.mysql.com/doc/refman/5.0/en/create-table-select.htmlも参照してください。

于 2010-11-29T13:43:31.787 に答える