MySQL erreur étrange dans CREATE ... SELECT: ERREUR 1062 (23000): entrée en double '0' pour la touche 1

StackOverflow https://stackoverflow.com/questions/4304150

  •  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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top