2010-11-29 7 views
2

これは問題のあるクエリです(意図した意味で、エンティティ530とペアになっているすべてのエンティティを新しいテーブルにプルし、ペアの数)で:私は主キーの一意性に違反しています苦情としてCREATE ...でMySQLの奇妙なエラーが発生しました。SELECT:ERROR 1062(23000):キー1のエントリが重複しました。

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

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 
; 

私はエラーメッセージを解釈します。しかし、私はグループ化その値で、一意性を確保する必要がありますよね?その後、私はこれをしようと考えた:

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 
; 

を驚いたことに、これは何の問題もなく動作しますが、にもかかわらず、私の理解によると、二人は同等でなければなりません。

?参考のため

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

固有のID値はありますか?いくつかのサンプルデータを投稿できますか? –

答えて

4

あなたのステートメントは等価ではありません。 CREATE ... SELECTは、文のCREATE部分(つまり、entity_idおよびnumrels)に記述した列を作成し、さらに文の一部の各列の列を作成します(SELECT)。新しいテーブルには4つの列があります。 SELECTの結果が最後の2つの列に挿入されます。その他の列にはデフォルト値が設定されているため、主キーの一意性に違反します。

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

+1

ありがとうございました!かなり正確ではありませんが、私は何が起こっていたのか理解していました。より正確には:私は別の同様のクエリを持っており、そのクエリが動作します。理由は、前のクエリが 'SELECT'と' CREATE'の両方に 'entity_id'を持っていたからです。この中には、 'entity2_id'があります。列名が同じ場合は、それらは結合されます。したがって、私はその中に2つのカラムを持っていましたが、この中には3つのカラムがありました( 'entity_id'、' numrels'、 'entity2_id')。 :D – Amadan

関連する問題