Ho avuto alcuni problemi di inserimento di dati da un'altra tabella in una nuova. L'obiettivo sembrava un po 'come questo:INSERT INTO/SELECT DISTINCT ha causato la violazione della chiave primaria per un SYS_GUID
CREATE TABLE TEST_T (
T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL,
T_VAL1 NUMBER(10) NOT NULL,
T_VAL2 VARCHAR2(10) NOT NULL,
PRIMARY KEY (T_GUID)
)
La versione semplificata della dichiarazione intendevo riempirlo con i dati:
INSERT INTO TEST_T (T_VAL1, T_VAL2)
SELECT DISTINCT
CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as t_val1,
zip_code as t_val2
FROM OTHER_TABLE_T
WHERE ...
ORDER BY t_val1
come io non sono fornendo un T_GUID
valutate, avrei assunto che ne ottengo uno fornito dalla funzione SYS_GUID
per ogni nuova riga. Ma qualcosa sta andando storto, e ottengo una violazione del vincolo di unicità per la chiave primaria.
Se rimuovo lo DISTINCT
, l'istruzione ha esito positivo, ma ottengo molte voci duplicate. E, naturalmente, se fornisco esplicitamente una chiamata SYS_GUID()
nel mio SELECT
, questo ha esattamente lo stesso risultato.
Ora ho scoperto che se ho semplicemente messo un altro SELECT
intorno miniera, funziona bene, senza violazioni di vincoli e le righe distinte vengono inseriti:
INSERT INTO ...
SELECT x.* FROM (
SELECT DISTINCT ...
) x
Quindi, da dove i GUID duplicati vengono? Se il set completo di righe non ha problemi, perché rimuovere le righe in modo distinto può causare problemi? Poiché SYS_GUID crea un identificatore univoco per ogni chiamata, posso solo immaginare che nel caso distinto venga chiamato solo una volta per l'intera clausola, che viene risolto dall'involucro circostante SELECT
. Sarei molto felice se qualcuno potesse spiegare come l'esecuzione differisce in quel caso.
Sei sicuro che il GUID vengono duplicati? Osservali molto attentamente, sembrano simili ma dovresti notare almeno un carattere diverso in ciascuno di essi. – GriffeyDog
Il tuo codice sembra corretto. È possibile che si stia verificando un errore di Oracle, cercare "DUPLICATE SYS_GUID generato su AIX può portare a errori ORA-1 durante l'accodamento [ID 1371805.1]" su Il mio supporto Oracle. –