MySQL erreur étrange dans CREATE ... SELECT: ERREUR 1062 (23000): entrée en double '0' pour la touche 1
-
29-09-2019 - |
Question
Ceci est la requête problématique (avec l'intention qui signifie: tirer toutes les entités paires avec l'entité 530 dans une nouvelle table, avec le nombre des paires):
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
la plainte que je viole l'unicité de la clé primaire. Cependant, je suis groupe par cette valeur, ce qui devrait garantir l'unicité, non? Alors je pensais essayer ceci:
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 se passe?!?
Pour référence:
mysql Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1
La solution
Vos déclarations ne sont pas équivalents. CREATE ... SELECT
crée les colonnes que vous mentionnez dans la partie CREATE
de la déclaration (qui est, ENTITY_ID et numrels), et en plus crée des colonnes pour chaque colonne de la partie SELECT
de la déclaration. 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 résulte en violation de l'unicité de votre clé primaire.
Voir aussi http: //dev.mysql. com / doc / refman / 5.0 / fr / créer table-select.html