Transact-SQL: Copia di dati fra tabelle: differenza fra DROP TABLE + SELECT INTO e DELETE + INSERT
Date due tabelle TABELLA_SORGENTE e TABELLA_DESTINAZIONE, per copiare tabella sorgente su tabella destinazione ci sono anche queste due soluzioni:
- Utilizzo dell’accoppiata DROP TABLE + SELECT INTO: assolutamente da EVITARE se avete a cuore la vostra tabella di destinazione.
- Utilizzo dell’accoppiata DELETE + INSERT: sicuramente il metodo da usare.
Il motivi per non usare l’accoppiata DROP TABLE + SELECT INTO sta nel fatto che tutti i CONSTRAINT ed i vincoli strutturale presenti sulla tabella che viene eliminata non vengono ovviamente ricreati dalla SELECT INTO ma vengono persi. Quella che viene creata è una tabella ad-hoc per i dati che deve contenere, nulla di più.
Un esempio concreto:
Creiamo una tabella sorgente e mettiamoci dei dati dentro:
CREATE TABLE TABELLA_SORGENTE (ID INT, DESCRIZIONE VARCHAR(20) NOT NULL DEFAULT 'PIPPO')
INSERT INTO TABELLA_SORGENTE VALUES (1,'PAPERINO');
INSERT INTO TABELLA_SORGENTE VALUES (2,'PLUTO');
Creiamo la tabella di destinazione, speculare alla tabella sorgente:
CREATE TABLE TABELLA_DESTINAZIONE (ID INT, DESCRIZIONE VARCHAR(20) NOT NULL DEFAULT 'PIPPO')
Utilizzando DELETE + INSERT abbiamo:
DELETE FROM TABELLA_DESTINAZIONE
INSERT INTO TABELLA_DESTINAZIONE SELECT * FROM TABELLA_SORGENTE
A questo punto la query
INSERT INTO TABELLA_DESTINAZIONE (ID) VALUES (3)
va a buon fine, e la tabella si presenta con questi record
1 PAPERINO
2 PLUTO
3 PIPPO
Utilizzando invece DROP TABLE + SELECT INTO abbiamo:
DROP TABLE TABELLA_DESTINAZIONE
SELECT * INTO TABELLA_DESTINAZIONE FROM TABELLA_SORGENTE
Sembrerebbe tutto uguale, ma il risultato della query
INSERT INTO TABELLA_DESTINAZIONE (ID) VALUES (3)
è il seguente:
Cannot insert the value NULL into column 'DESCRIZIONE', table 'NICOLA.dbo.TABELLA_DESTINAZIONE'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Questo perchè la condizione DEFAULT ‘PIPPO’ della dichiarazione iniziale della tabella
CREATE TABLE TABELLA_DESTINAZIONE (ID INT, DESCRIZIONE VARCHAR(20) NOT NULL DEFAULT 'PIPPO')
ora non è più presente.
Quindi non fate mai DROP TABLE + SELECT INTO su tabelle cui volete bene.
Leave a Reply