Salta el contingut

Escriptures a la Base de Dades - INSERT

INSERT amb els noms de les columnes

La comanda INSERT s'utilitza per afegir noves files en una taula.

La comanda necessita tres paràmetres:

  • el nom de la taula,

  • els noms de les columnes de la taula a les que volem donar valor,

  • els valors corresponents a cada columna.

Com INSERIM les següents dades per a crear un nou departament a la taula copy_departments?

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
200 Human Resources 205 1500
INSERT INTO copy_departments (department_id, department_name, manager_id, location_id)
VALUES (200,'Human Resources', 205, 1500);

La sentència anterior mostra explícitament cadascuna de les columnes de la taula.

Els valors de les columnes es mostren en el mateix ordre.

També podem inserir els valors sense haver d'escriure el nom de les columnes, només cal posar-les totes en el mateix ordre en què ens mostra la comanda DESCRIBE.

En aquest cas, cal proporcionar valor per a totes les columnes.

INSERT sense els noms de les columnes

Podem escriure la sentència INSERT sense explicitar els noms de les columnes.

Tot i això, es recomana, per una major claredat, escriure sempre els noms de les columnes en les sentències INSERT.

DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
210 Estate Management 102 1700
INSERT INTO copy_departments
VALUES (210,'Estate Management', 102, 1700);

Abans de l'INSERT

Abans d'inserir les dades a la taula, cal comprovar alguns detalls de la taula.

La sentència DESCRIBE retorna una descripció de l'estructura de la taula.

describe copy_departments;
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| DEPARTMENT_ID   | int(4)      | NO   | PRI | NULL    |       |
| DEPARTMENT_NAME | varchar(30) | NO   |     | NULL    |       |
| MANAGER_ID      | int(6)      | YES  |     | NULL    |       |
| LOCATION_ID     | int(4)      | YES  | MUL | NULL    |       |
+-----------------+-------------+------+-----+---------+-------+

La sentència DESCRIBE retorna informació com ara:

  • Permís de valors duplicats

  • Tipus de dada permès

  • Mida del camp

  • Possibilitat de valor NULL o no

  • El camp Key indica si forma part de la Clau primària amb PRI

  • Quan el camp Key indica MUL molt possiblement sigui una Clau Forana. També ho indicarà per altres índexos creats.

INSERT amb valors NULL

La sentència INSERT no necessita especificar totes les columnes; podem excloure columnes que volem deixar amb el valor NULL o bé amb el valor que se'ls assigna per defecte (DEFAULT).

Si assignem valor a tots els camps que en necessiten és més que suficient.

A la taula employees el camp EMAIL es defineix com una columna NOT NULL.

Si no donem valor a aquesta columna, ens donarà un error*.

ERROR 1364 (HY000): Field 'EMAIL' doesn't have a default value

En algunes versions de MariaDB cal tenir activat el mode STRICT_TRANS_TABLES a la clàusula sql_mode del fitxer de configuració.

Una inserció implícita inserirà automàticament un valor NULL a les columnes que permeten valors NULs, excepte que tingui assignat un valor per defecte (Default).

Per afegir explícitament un valor NULL a una columna que permet valors NULs utilitzarem la paraula NULL com a valor.

Per expecificar una cadena buida (que no és el mateix que el valor NUL) farem servir dues cometes senzilles seguides sense cap caràcter enmig, ''.

INSERT INTO copy_employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary)
VALUES (302, 'Grigorz', 'Polanski', 'gpolanski',' ', '2015-06-15', 'IT_PROG', 4200);

INSERT amb valors ESPECIALS

A la sentència INSERT podem utilitzar valors com ara CURRENT_DATE, CURRENT_USER, etc

Podem veure funcions d'informació al següent enllaç: https://mariadb.com/kb/en/information-functions/

Cal assegurar-se del format a utilitzar per a la inserció de camps de tipus DATE, TIME i DATETIME.

Sempre podem usar la funció STR_TO_DATE.

INSERT INTO copy_employees (employee_id, first_name, last_name, email, phone_number,
hire_date,
job_id, salary)
VALUES (303,'Angelina','Wright', 'awright','4159982010',
STR_TO_DATE('10 07 2015 17:20', '%d %m %Y %H:%i'),
'MK_REP', 3600);

Un altre exemple amb CURRENT_USER i CURRENT_DATE.

INSERT INTO copy_employees (employee_id, first_name,
last_name,
email, phone_number,
hire_date,
job_id, salary)
VALUES (304,'Test',
SUBSTRING(CURRENT_USER, 1, INSTR(CURRENT_USER, '@') - 1),
't_user', 4159982010,
CURRENT_DATE,
'ST_CLERK',2500);

SUBCONSULTA per a inserir files

Podem afegir més d'una fila a la vegada (o una sola també) utilitzant una subconsulta que ens retorni tantes files com necessitem i on cada fila contingui el valor de totes les columnes a assignar.

El nombre total de columnes que retorni la subconsulta i el tipus de dada de les mateixes ha de ser el mateix de la taula on volem fer els INSERTs.

Podem posar el nom de les columnes de forma explícita o bé no posar-lo i especificar valor per a cada una d'elles.

La subconsulta no va inclosa entre parèntesis.

INSERT INTO taula [(camp1, camp2, camp...)]
SELECT ... FROM ... [WHERE ...];