<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`. :::