Limbajul SQL prezinta trei tipuri de operatii pentru manipularea datelor din tabele: inserare, modificare si stergere. Fiecarei operatii ii corespunde o instructiune SQL: INSERT, UPDATE si DELETE.
Instructiunea INSERT permite inserarea (adaugarea) de noi inregistrari intr-un tabel. Pentru instructiunea INSERT pot fi utilizate urmatoarele sintaxe.
INSERT [LOW_PRIORITY] [IGNORE] [INTO] nume_tabel [(nume_coloana, ...)] VALUES ({expresie | DEFAULT}, ...), (...), ...
INSERT [LOW_PRIORITY] [IGNORE] [INTO] nume_tabel SET nume_coloana = {expresie | DEFAULT}, ...
INSERT [LOW_PRIORITY] [IGNORE] [INTO] nume_tabel [(nume_coloana, ...)] SELECT ...
Primele doua sintaxe, INSERT … VALUES si INSERT … SET, permit introducerea de inregistrari pe baza unor valori specificate explicit. Cea de-a treia forma, INSERT … SELECT, permite inserarea de inregistrari care contin valori selectate din tabele.
mysql> USE sakila Database changed mysql> DESCRIBE actor; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(45) | NO | | NULL | | | last_name | varchar(45) | NO | MUL | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+
Adaugarea de noi inregistrari intr-un tabel necesita cunoasterea structurii acestuia: lista coloanelor, domeniile de definitie ale coloanelor, optiunile stabilite la nivelul lor.
mysql> INSERT -> INTO actor (first_name, last_name) -> VALUES ("BRUCE", "JOHNSON");
Prima sintaxa a instructiunii INSERT permite si introducerea de inregistrari multiple. Pentru aceasta sunt precizate liste multiple de valori (fiecare lista de valori este trecuta intre paranteze rotunde), delimitate prin virgula.
mysql> INSERT -> INTO actor (first_name, last_name) -> VALUES ("DAKOTA", "HARDY"), -> ("TOM", "WILLIS");
Clauza LOW_PRIORITY se utilizeaza pentru a intarzia scrierea efectiva a datelor in tabel, pana cand utilizatorii nu mai citesc date din acesta.
Clauza IGNORE este utila daca se introduc mai multe inregistrari prin intermediul aceleiasi instructiuni INSERT; prin utilizarea acestei clauze, inregistrarile gresite sunt ignorate, iar cele corecte sunt adaugate fara raportarea unei erori. Dupa executia instructiunii este raportat doar numarul de inregistrari inserate.
mysql> INSERT IGNORE -> INTO actor (actor_id, first_name, last_name) -> VALUES(1, "GARY", "CRUISE"), -> (391, "TOM", "OLDMAN"); Query OK, 1 row affected, 1 warning (0.05 sec) Records: 2 Duplicates: 1 Warnings: 1 mysql> SHOW WARNINGS; +---------+------+---------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------+ | Warning | 1062 | Duplicate entry '1' for key 'PRIMARY' | +---------+------+---------------------------------------+
Clauza INTO se utilizeaza pentru compatibilitatea cu alte sisteme SQL. Clauza VALUES specifica seturile de date care urmeaza a fi adaugate in tabel; daca nu este precizata o lista de coloane dupa numele tabelului, atunci trebuie introduse valori pentru toate coloanele din tabel, in ordinea de la definirea tabelului.
mysql> INSERT -> INTO actor -> VALUES (392, "ERIC", "HANKS", CURRENT_TIMESTAMP());
mysql> SELECT * -> FROM actor -> ORDER BY last_update DESC -> LIMIT 5; +----------+------------+-----------+---------------------+ | actor_id | first_name | last_name | last_update | +----------+------------+-----------+---------------------+ | 392 | ERIC | HANKS | 2019-03-29 22:39:59 | | 391 | TOM | OLDMAN | 2019-03-29 22:35:25 | | 202 | DAKOTA | HARDY | 2019-03-29 22:19:57 | | 203 | TOM | WILLIS | 2019-03-29 22:19:57 | | 201 | BRUCE | JOHNSON | 2019-03-29 22:17:50 | +----------+------------+-----------+---------------------+
Daca dupa numele tabelului in care sunt introduse datele este precizata o lista de coloane din tabel, atunci vor fi precizate valori pentru coloane, in ordinea stabilita in lista. In acest caz, coloanele din tabel care nu apar in lista vor primi valori implicite.
Pentru forma INSERT … SET lista de coloane nu este necesara, deoarece clauza SET introduce perechi de tipul coloana – valoare.
mysql> INSERT -> INTO actor -> SET first_name = "GARY", last_name = "ROBERTS";
Forma INSERT … SELECT permite colectarea unor valori dintr-un tabel si introducerea lor intr-o lista de valori care urmeaza a fi inserata. De exemplu, datele corespunzatoare ultimelor 5 inregistrari introduse la nivelul tabelului actor pot fi colectate in vederea reintroducerii lor la nivelul tabelului.
mysql> INSERT -> INTO actor (first_name, last_name) -> SELECT first_name, last_name -> FROM actor -> ORDER By last_update DESC -> LIMIT 5;
mysql> SELECT * -> FROM actor -> ORDER BY last_update DESC -> LIMIT 10; +----------+------------+-----------+---------------------+ | actor_id | first_name | last_name | last_update | +----------+------------+-----------+---------------------+ | 395 | ERIC | HANKS | 2019-03-29 22:50:47 | | 394 | GARY | ROBERTS | 2019-03-29 22:50:47 | | 398 | DAKOTA | HARDY | 2019-03-29 22:50:47 | | 397 | TOM | WILLIS | 2019-03-29 22:50:47 | | 396 | TOM | OLDMAN | 2019-03-29 22:50:47 | | 393 | GARY | ROBERTS | 2019-03-29 22:45:20 | | 392 | ERIC | HANKS | 2019-03-29 22:39:59 | | 391 | TOM | OLDMAN | 2019-03-29 22:35:25 | | 203 | TOM | WILLIS | 2019-03-29 22:19:57 | | 202 | DAKOTA | HARDY | 2019-03-29 22:19:57 | +----------+------------+-----------+---------------------+
Daca nu sunt stabilite valori implicite, in coloanele declarate NOT NULL vor fi setate valorile implicite corespunzatoare tipurilor de date ale coloanelor (0 pentru tipuri numarice, sirul vid (”) pentru siruri de caractere si valoarea 0 (“0000-00-00”) pentru data calendaristica si timp.