<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Inserció de registres
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2023/2024</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
## Introducció
Una vegada s'ha definit un model de dades en una base de dades és possible
realitzar consultes per manipular les dades emmagatzemades, com consultar
dades, insertar-ne de noves, modificar-les o eliminar-les.
Totes aquestes operacions es realitzen mitjançant el __Llenguatge de Manipulació de Dades (DML)__,
un subllenguatge de __SQL__.
Aquest material es centrarà a estudiar com inserir dades a una base de dades.
## DML
El __Llenguatge de Manipulació de Dades (DML o _Data Definition Language_)__ és un
subllenguatge de SQL que permet manipular les dades de una base de dades.
Les accions que es permeten són:
- `SELECT`: Permet consultar les dades de la base de dades.
- `INSERT`: Permet inserir noves dades a la base de dades.
- `UPDATE`: Permet modificar dades existents.
- `DELETE`: Permet elmininar dades.
::: docs
Documentació oficial sobre DML:
- MariaDB: https://mariadb.com/kb/en/data-manipulation/
- MySQL 8.0: https://dev.mysql.com/doc/refman/8.0/en/sql-data-manipulation-statements.html
:::
## INSERT
La sentència `INSERT` permet inserir noves dades a una base de dades.
Té el següent format:
```sql
INSERT INTO database.table_name (column_1, column_2, column_3, ...) VALUES
(value_11, value_12, value_13, ...),
(value_21, value_22, value_23, ...),
...
(value_N1, value_N2, value_N3, ...);
```
- `INSERT INTO`: Indica que volem inserir nous registres a una taula.
- `database.table_name`: S'especifica la base de dades i la taula on es dessitja inserir els registres.
Especificar `database` és opcional, sempre i quan s'haja fet ús de la sentència `USE` abans.
- `(columns...)`: Indica a quines columnes s'especificaran els valors al realitzar la inserció.
- `VALUES`: Indica que a partir d'aquest moment s'especificaran els valors dels registres.
- `(values...)`: Tuples que contenen els valors del nou registre. Cada tupla ha de tindre el mateix nombre
de valors que l'especificat en `(columns...)` i cal especificar els valors en el mateix ordre.
Es poden especificar múltiples tuples en un mateix `INSERT`.
::: docs
Documentació oficial sobre inserir nous registres:
- MariaDB: https://mariadb.com/kb/en/insert/
- MySQL 8.0: https://dev.mysql.com/doc/refman/8.0/en/insert.html
:::
Al realitzar la consulta no és necessari especificar totes les columnes en `(columns...)`.
- Si no s'indica cap columna, la sentència utilitzarà totes les columnes de la taula.
- Si una columna no és especificada, el seu valor serà:
- El valor per defecte si s'ha especificat `DEFAULT`.
- El següent valor disponible si s'ha especificat `AUTO_INCREMENT`.
- `NULL` si la columna permet valors nuls.
- Si cap de les opcions anteriors es pot aplicar, es produirà un error.
::: example "DEFAULT i NULL"
```sql
CREATE TABLE persona (
dni CHAR(9) PRIMARY KEY
);
CREATE TABLE cotxe (
matricula CHAR(7) PRIMARY KEY,
n_bastidor CHAR(8) UNIQUE NOT NULL,
marca VARCHAR(50) NOT NULL,
model VARCHAR(50) NOT NULL,
km INT UNSIGNED NOT NULL DEFAULT 0,
dni_propietari CHAR(9),
data_compra DATE NULL,
FOREIGN KEY (dni_propietari) REFERENCES persona (dni)
);
INSERT INTO cotxe (matricula, n_bastidor, marca, model)
values ("4231KJL", "16483920", "Ford", "Focus");
INSERT INTO cotxe (matricula, n_bastidor, model)
values ("3457BNR", "34256234", "Ibiza");
Error Code: 1364. Field 'marca' doesn't have a default value
SELECT * FROM cotxe;
+-----------+------------+-------+-------+----+----------------+-------------+
| matricula | n_bastidor | marca | model | km | dni_propietari | data_compra |
+-----------+------------+-------+-------+----+----------------+-------------+
| 4231KJL | 16483920 | Ford | Focus | 0 | NULL | NULL |
+-----------+------------+-------+-------+----+----------------+-------------+
```
En la consulta anterior, s'ha inserit un cotxe en el qual no s'ha especificat
el propietari ni la data de compra.
- El valor de `km` és 0, el valor per defecte.
- El valor de `dni_propietari` és nul.
- El valor de `data_compra` és nul.
Després s'ha intentat inserir un cotxe on no hem especificat la `marca`. Com
aquest atribut s'ha definit com `NOT NULL`, la sentència falla.
:::
::: example "AUTO_INCREMENT"
```sql
CREATE TABLE producte (
id_producte INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(50) NOT NULL,
preu DECIMAL(5, 2) NOT NULL
);
INSERT INTO producte (nom, preu) values
("Barra de pa", "0.5"),
("Botella d'aigua", "1");
INSERT INTO producte (id_producte, nom, preu) values
(10, "Napolitana xocolate", "1.5");
SELECT * FROM producte;
+-------------+---------------------+------+
| id_producte | nom | preu |
+-------------+---------------------+------+
| 1 | Barra de pa | 0.50 |
| 2 | Botella d'aigua | 1.00 |
| 10 | Napolitana xocolate | 1.50 |
+-------------+---------------------+------+
```
En la consulta anterior s'han afegit diferents productes. Podem observar
que la primera inserció no s'ha especificat l'atribut `id_producte`, i per tant,
han rebut el valor de `AUTO_INCREMENT`.
:::