2010-11-29 96 views
2

這是有問題的查詢(具有意圖的含義:將與實體530配對的所有實體拉入新表,與對的計數):CREATE ... MySQL中的奇怪錯誤SELECT:錯誤1062(23000):鍵1的重複條目'0'

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 
; 

令人驚訝的是,這工作沒有任何問題,儘管,根據我的理解,這兩個應該是等價的。

什麼給?!?

參考:

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

您獲得唯一的id值嗎?你能發佈一些示例數據嗎? – 2010-11-29 13:39:11

回答

4

你的語句是不等價的。 CREATE ... SELECT創建您在聲明的CREATE部分(即entity_id和numrels)中提及的列,並且還爲聲明的SELECT部分的每個列創建列。你最終在你的新表中有四列。 SELECT的結果被插入到最後兩列中。其他列填充其默認值,這會導致違反主鍵的唯一性。

另請參見http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

+1

謝謝!不完全正確,但足夠正確,我知道發生了什麼。更確切地說:我有另一個類似的查詢,並且這個查詢有效。原因是,以前的查詢在`SELECT`和`CREATE`中都有`entity_id`;在這一個,我有`entity2_id`。如果列名相同,則它們是混合的。因此,我在這一列中有兩列,但在這一列中有三列(`entity_id`,`numrels`,`entity2_id`)。 :d – Amadan 2010-11-29 17:06:21

相關問題