2010-11-29 3 views
2

C'est la requête problématique (avec la signification prévue: tirer toutes les entités appariées avec l'entité 530 dans une nouvelle table, avec le nombre des paires):Erreur MySQL étrange dans CREATE ... SELECT: ERREUR 1062 (23000): Dupliquer l'entrée '0' pour la clé 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 
; 

J'interprète le message d'erreur:

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

que la plainte que je viole l'unicité de la clé primaire. Cependant, je suis regroupant par cette valeur, ce qui devrait assurer l'unicité, non? Alors je pensais à essayer:

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 
; 

De façon surprenante, cela fonctionne sans aucun problème, même si, selon ma compréhension, les deux devraient être équivalents.

Qu'est-ce qui donne?!?

Pour référence:

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

Les valeurs d'identifiant sont-elles uniques? Pouvez-vous poster quelques exemples de données? –

Répondre

4

Vos déclarations ne sont pas équivalents. CREATE ... SELECT crée les colonnes que vous mentionnez dans la partie CREATE de l'instruction (c'est-à-dire, entity_id et numrels) et crée en outre des colonnes pour chaque colonne de la partie SELECT de l'instruction. Vous vous retrouvez avec quatre colonnes dans votre nouvelle table. Les résultats de SELECT sont insérés dans les deux dernières colonnes. Les autres colonnes sont remplies avec leurs valeurs par défaut, ce qui entraîne la violation de l'unicité de votre clé primaire.

Voir aussi http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

+1

Merci! Pas tout à fait correct, mais assez correct que j'ai compris ce qui se passait. Plus précisément: j'ai une autre requête similaire, et celle-ci fonctionne. La raison en est que la requête avait auparavant 'entity_id' dans' SELECT' et 'CREATE'; dans celui-ci, j'ai 'entity2_id'. Si les noms de colonne sont les mêmes, ils sont confondus. Ainsi, j'avais deux colonnes dans celui-là, mais trois dans celui-ci ('entity_id',' numrels', 'entity2_id'). :RÉ – Amadan