MySQL strano errore di CREATE ... SELECT: ERRORE 1062 (23000): voce duplicata '0' per la chiave 1

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

  •  29-09-2019
  •  | 
  •  

Domanda

Questa è la query problematica (con l'intesa che significa: estrarre tutte le entità in coppia con un'entità 530 in una nuova tabella, con il conteggio delle coppie):

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
;

Interpreto il messaggio di errore:

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

come la denuncia che sto violando l'unicità della chiave primaria. Tuttavia, sono raggruppamento di quel valore, che dovrebbe garantire l'unicità, giusto? Poi ho pensato di provare questo:

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
;

Sorprendentemente, questo funziona senza problemi, anche se, secondo la mia comprensione, i due dovrebbero essere equivalenti.

Ciò che dà?!?

Per riferimento:

mysql  Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1
È stato utile?

Soluzione

Le sue dichiarazioni non sono equivalenti. CREATE ... SELECT crea le colonne di cui parli nella parte CREATE della dichiarazione (che è, ENTITY_ID e numrels), e in aggiunta crea colonne per ogni colonna della parte SELECT della dichiarazione. Si finisce con quattro colonne nella nuova tabella. I risultati di SELECT vengono inseriti nelle ultime due colonne. Le altre colonne vengono riempite con i loro valori di default, che si traduce nel violare l'unicità della chiave primaria.

Vedi anche http: //dev.mysql. com / doc / refman / 5.0 / it / create-table-select.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top