L'istruzione INSERT

INSERT INTO

Dopo aver creato una o più tabelle, queste vanno riempite con tuple, a tale scopo si usa l’istruzione INSERT INTO di SQL. Esistono due possibile sintassi per INSERT INTO:

  • indicando tutti i valori degli attributi e
  • indicando solo alcuni dei valori degli attributi.

Formato contratto e completo

Per inserire uno o più tuple in una tabella, si può elencare tra parentesi tonde la lista dei valori per ogni attributo nello stesso ordine in cui sono stati dichiarati nella CREATE.

Ad esempio per inserire alcuni record nella tabella Student utilizziamo INSERT INTO nel seguente modo.

INSERT INTO VALUES
    (1, 'Raimondo', 'Bianchi', '2004-01-01', '2023-02-17 09:00:00', '123 Main St', 'raimondo@example.com'),
    (2, 'Edoardo', 'Conte', '2004-08-19', '2023-02-17 09:30:00', '456 Elm St', 'edoardo@example.com'),
    (3, 'Mario', 'Bianchi', '2008-05-10', '2023-02-17 10:00:00', '789 Oak St', 'mario@example.com'),
    (4, 'Alice', 'Rossi', '2003-02-20', '2023-02-17 10:30:00', '101 Maple St', 'alice@example.com'),
    (5, 'Mario', 'Rossi', '2007-10-31', '2023-02-17 11:00:00', '202 Cedar St', 'mario2@example.com'),
    (6, 'Barbara', 'Verdi', '2007-04-01', '2023-02-17 11:30:00', '303 Pine St', 'barbara@example.com'),
    (7, 'Carlo', 'Rossi', '2006-10-31', '2023-02-17 12:00:00', '404 Birch St', 'carlo@example.com'),
    (8, 'Davide', 'Visconti', '2004-06-22', '2023-02-17 12:30:00', '505 Redwood St', 'davide@example.com'),
    (9, 'Michela', 'Sciascia', '2006-02-22', '2023-02-17 13:00:00', '606 Cedar St', 'michela@example.com');

La tabella risultate

student_idfirst_namelast_namebirth_dateregistration_datehome_addressemail
1RaimondoBianchi2004-01-012023-02-17 09:00:00123 Main Straimondo@example.com
2EdoardoConte2004-08-192023-02-17 09:30:00456 Elm Stedoardo@example.com
3MarioBianchi2008-05-102023-02-17 10:00:00789 Oak Stmario@example.com
4AliceRossi2003-02-202023-02-17 10:30:00101 Maple Stalice@example.com
5MarioRossi2007-10-312023-02-17 11:00:00202 Cedar Stmario2@example.com
6BarbaraVerdi2007-04-012023-02-17 11:30:00303 Pine Stbarbara@example.com
7CarloRossi2006-10-312023-02-17 12:00:00404 Birch Stcarlo@example.com
8DavideVisconti2004-06-222023-02-17 12:30:00505 Redwood Stdavide@example.com
9MichelaSciascia2006-02-222023-02-17 13:00:00606 Cedar Stmichela@example.com

Formato esteso e parziale

Supponiamo ora di aver creato la tabella Student nel seguente modo.

CREATE TABLE Student (
    student_id INT PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255), NOT NULL
    birth_date DATE NOT NULL,
    registration_date DATETIME DEFAULT '2023-01-01 00:00:00',
    home_address TEXT,
    email VARCHAR(100) NOT NULL UNIQUE
);

L’attributo registration_date ha un valore di default (discutibile!) per cui potrei evitare di indicarlo in fase di inserimento. Posso evitare di indicare anche home_address poiché non è stato indicato con NOT NULL e di conseguenza ha NULL come valore di default. Tuttavia email va indicato perché è segnato come NOT NULL e non ha alcun valore di default.

Per indicare solo parte degli attributi a cui assegnare un valore, devo elencare nell’istruzione INSERT INTO quali attributi intendo indicare fornendone il nome. Ecco un esempio in cui sono stti omessi i valori per registration_date e home_address.

INSERT INTO Student (student_id, first_name, last_name, birth_date, email)
VALUES
    (1, 'Raimondo', 'Bianchi', '2004-01-01', 'raimondo@example.com'),
    (2, 'Edoardo', 'Conte', '2004-08-19', 'edoardo@example.com'),
    (3, 'Mario', 'Bianchi', '2008-05-10', 'mario@example.com'),
    (4, 'Alice', 'Rossi', '2003-02-20', 'alice@example.com'),
    (5, 'Mario', 'Rossi', '2007-10-31', 'mario2@example.com'),
    (6, 'Barbara', 'Verdi', '2007-04-01', 'barbara@example.com'),
    (7, 'Carlo', 'Rossi', '2006-10-31', 'carlo@example.com'),
    (8, 'Davide', 'Visconti', '2004-06-22', 'davide@example.com'),
    (9, 'Michela', 'Sciascia', '2006-02-22', 'michela@example.com');

La risultante tabella sarà la seguente.

student_idfirst_namelast_namebirth_dateregistration_datehome_addressemail
1RaimondoBianchi2004-01-012023-01-01 00:00:00NULLraimondo@example.com
2EdoardoConte2004-08-192023-01-01 00:00:00NULLedoardo@example.com
3MarioBianchi2008-05-102023-01-01 00:00:00NULLmario@example.com
4AliceRossi2003-02-202023-01-01 00:00:00NULLalice@example.com
5MarioRossi2007-10-312023-01-01 00:00:00NULLmario2@example.com
6BarbaraVerdi2007-04-012023-01-01 00:00:00NULLbarbara@example.com
7CarloRossi2006-10-312023-01-01 00:00:00NULLcarlo@example.com
8DavideVisconti2004-06-222023-01-01 00:00:00NULLdavide@example.com
9MichelaSciascia2006-02-222023-01-01 00:00:00NULLmichela@example.com
Attenzione

Se si prova a creare un’istruzione INSERT INTO omettendo attributi che non hanno valore di default e che sono segnati NOT NULL, verrà generato un errore e l’operazione di inserimento non andrà a buon fine.

Domande e Esercizi

Esercizio: Gestione di un magazzino

  • Utilizzando lo schema creato nell’esercizio alla fine della lezione precedente scrivere l’istruzione INSERT INTO in modo che ogni tabella abbia almeno quattro tuple.
  • Utilizzare sia la versione completa che la versione parziale di INSERT INTO modificando lo schema inserendo vincoli NOT NULL dove opportuno e fornendo per gli attributi pertinenti dei valori di default.

  • Michele Schimd © 2024
  • Ultimo aggiornamento: 17/02/2024
  • Materiale di studio e di esercizio per gli alunni dello Zuccante.

Creative Commons License