You are on page 1of 9

1.

INTRODUCCIÓ
El DML (Llenguatge de Manipulación de Dades) és una de les parts fonamentals del
llenguatge SQL. Ho formen les instruccions capaces de modificar (afegir, canviar o
eliminar) les dades de les taules.

Al conjunt d'instruccions DML que s'executen consecutivament, se'n diu transacció.


L'interessant de les transaccions és que podem anul·lar-les, ja que formen una unitat
lògica de treball que fins que no s'accepten, els seus resultats no seran definitius.

En totes les instruccions DML, l'única dada retornada pel sistema és el nombre de files
que s'han modificat en executar la instrucció.

Abans d'introduir-nos en l'estudi de les instruccions INSERT, UPDATE i DELETE, cal


conéixer com el SGBD gestiona les instruccions d'inserció, eliminació i modificació que
puguem executar, ja que hi ha dues possibilitats de funcionament:

 Que queden automàticament validades i no hi haja possibilitat de tirar arrere. En


aquest cas, els efectes de tota instrucció d'actualització de dades que tinga èxit són
automàticament accessibles des de la resta de connexions de la base de dades.
(L'opció que tenim en les màquines virtuals per defecte)

 Que queden en una cua d'instruccions, que permet tirar arrere. En aquest cas, es diu
que les instruccions de la cua estan pendents de validació, i l'usuari ha d'executar,
quan el creu convenient, una instrucció per a validar-les (anomenada COMMIT) o
una instrucció per a tirar arrere (anomenada ROLLBACK ).

Aquest funcionament implica que els efectes de les instruccions pendents de validació
no es veuen per la resta de connexions de la base de dades, però sí que són accessibles
des de la connexió on s'han efectuat. En executar la COMMIT, totes les connexions
accedeixen a l'efecte de les instruccions validades. En cas d'executar ROLLBACK, les
instruccions desapareixen de la cua i cap connexió (ni la pròpia ni la resta) no accedeix
als efectes corresponents, és a dir, és com si mai hagueren existit.

Aquests possibles funcionaments formen part de la gestió de transaccions que


proporciona el SGBD i que cal estudiar amb més deteniment. A l'hora, però, d'executar
instruccions INSERT, UPDATE i DELETE hem de conéixer el funcionament del SGBD
per a poder actuar en conseqüència.

Així, per exemple, un SGBD MySQL funciona amb validació automàtica després de cada
instrucció d'actualització de dades no s'indica el contrari i, en canvi, un SGBD Oracle
funciona amb la cua d'instruccions pendents de confirmació.

En canvi, en MySQL, si es vol desactivar l'opció d'autocommit que hi ha per defecte,


caldrà executar la següent instrucció:

SET autocommit = 0;

En el nostre cas, mantindrem l'opció per defecte de MySQL i desactivarem l'opció de


“Safe Updates”. Això permetrà que les nostres sentències UPDATE o DELETE
s'executen sense seguretat (encara que siga eliminar tots els registres d'una taula) i
puguem fer les pràctiques de manera fluida.
Cal llevar l'opció per defecte que és que 'Safe updates' estiga seleccionat. Aquesta
opció no afecta a INSERT, però si a UPDATE i DELETE.

Recorda reconnectar amb el servidor perquè la nova configuració tinga efecte. Dues
opcions:

 Tanca la connexió i torna-la a obrir


 Reconnecta a través de l'opció en el menú Query/Reconnect to Server

2. LLENGUATGE DE MANIPULACIÓ DE DADES: DML


Una vegada que s'ha creat de manera convenient les taules, el següent pas consisteix
a inserir dades en elles, és a dir, afegir tuplas. Durant la vida de la base de dades serà
necessari, a més, esborrar determinades tuplas (files) o modificar els valors que
contenen. Els comandos de SQL que s'estudiaran en aquest apartat són INSERT,
UPDATE i DELETE. Aquests comandos pertanyen al DML.

3. INSERCIÓ DE DADES
El comando INSERT de SQL permet introduir dades en una taula o en una vista de la
base de dades (les vistes no les considerarem). La sintaxi d’INSERT és la següent:
INSERT INTO nom_taula [(columna1 [, columna2]...)]

VALUES ({expresió|valor} [, {expresió|valor}] ... )

[, ({expresió|valor} [, {expresió|valor}] ... )]...;

En ella podem distingir les paraules reservades INSERT INTO seguides del nom de la
taula en la qual guardarem les noves dades.

Opcionalment podem posar entre parèntesi els noms dels camps en en els camps en
els quals volem posar valors, si no els incloem, s'hauran de col·locar tots els valors en
el mateix ordre en què van ser creats els camps(és l'ordre de columnes segons les
retorna el comando DESCRIBE), perquè en cas contrari es produirà un error si els tipus
no coincideixen o s'emmagatzemarà la informació de manera errònia en cas que els
tipus de dades dels camps siguen compatibles.

Les dades de les files a introduir, s'especifiquen després de l'apartat VALUES.

Cada nova fila requereix un parèntesi amb els seus valors. Es poden introduir diverses
files amb un sol INSERT separant cada parèntesi amb comes.

En cada nova fila els valors han de correspondre's amb l'ordre de les columnes.

Suposem que tenim el següent disseny físic d'una taula (Comprova-ho en el SGBD) :

CREATE SCHEMA PROVA;

USE PROVA;

CREATE TABLE EMPLEATS (

COD integer PRIMARY KEY,

NOM VARCHAR(50) NOT NULL,

LOCALITAT VARCHAR(50) DEFAULT 'Écija',

DATANAIX date);

Com es pot observar, els camps LOCALITAT i DATANAIX no són obligatoris pel que
podríem optar per no emplenar-los. En aqueix cas, hauríem de definir en INSERT quins
camps emplenarem i en quin ordre. Per exemple:

INSERT INTO EMPLEATS(NOM, COD) VALUES ('Ana', 1);


/* També podem introduir varies files */

INSERT INTO EMPLEATS(NOM, COD) VALUES ('Pep', 2), ('Gemma', 3);

SELECT * FROM EMPLEATS;

Si un camp té valor per defecte (DEFAULT) i l’INSERT no especifica valor per al camp,
se li asigna el valor per defecte.

També podem no especificar els camps a omplir i en aquest cas hem d'assignar valors
a tots els camps en l'ordre de creació. Per exemple:

INSERT INTO EMPLEATS VALUES (4, 'Joan', 'Osuna', '1999-01-30'),

(5, 'Juan', DEFAULT, NULL), (3, 'Sara', NULL, NULL);

Com veiem s'introdueixen dades en tots els camps en l'ordre de creació.

També, seria equivalent, podríem fer-ho amb un sol INSERT:

INSERT INTO EMPLEATS VALUES (1, 'Pepe', 'Osuna', '1999-01-30'), (2,


'Juan', DEFAULT, NULL), (3, 'Sara', NULL, NULL);

És obligatori introduir valors per als camps COD i NOM. Aquests camps no poden tindre
valor NULL.

Columnes auto_increment

La columnes auto_increment tenen per objecte establir una clau quan no tenim en
una taula una clau clara.

Normalment es descriuen les descrivim així:

NomCamp integer auto_increment Primary Key

Encara que també podrien tindre la restricció UNIQUE en lloc de la de Primary Key.

El seu objecte és que el sistema assigne un valor al camp de manera que sempre
assigna un valor diferent (d’acord a una secuencia).

Es pot assignar un valor a una columna auto_increment encara que desvirtuaria el


seu sentit pel que normalment, quan es fa una inserció, o no s'assigna valor al camp o
se li assigna el valor NULL. En tots dos casos, el sistema assignarà al camp el valor
que corresponga. Exemple:

create table prova3 (


num integer auto_increment primary key,
nom varchar(10));
insert into prova3 values(null,'Pere');
insert into prova3 (nom) values('Anna');
select * from prova3;

Inserció de dades obtingudes d'una consulta

També és possible inserir dades en una taula que hagen sigut obtinguts d'una consulta
realitzada a una altra taula o altres taules. La seua forma és:

INSERT INTO taula [(columna1 [, columna2]...)]

SELECT ...

Ha de respectar-se el que s'ha dit anteriorment respecte als camps. La consulta SELECT
ha de retornar la mateixa quantitat i tipus de camps compatibles amb els definits en la
taula.

Com en el cas anterior, podem optar per especificar o no els camps a omplir. Per
exemple, suposant que disposem d'una taula BUS_OSUNA amb el següent disseny:

CREATE TABLE BUS_OSUNA (

NUM integer PRIMARY KEY,

NOM VARCHAR(50));

INSERT INTO BUS_OSUNA

SELECT COD, NOM FROM EMPLEATS

WHERE LOCALITAT =’Osuna’;

SELECT * FROM BUS_OSUNA;


També podem indicar els camps a inserir, tenint en compte que, en aquest cas els
camps de la que no accepten valors NULL. Por el tant, és obligatori introduir valors per
a ells:

INSERT INTO BUS_OSUNA (NUM)

SELECT COD FROM EMPLEATS

WHERE LOCALITAT IS NULL;

SELECT * FROM BUS_OSUNA;

RESUM INSERT

Podem inserir en una taula el resultat d'una consulta sobre una altra taula. En aquest cas
normalment s'inseriran diverses files amb una sola sentència. Utilitzarem el següent format:

INSERT INTO NomTaula [( NomColumna [,NomColumna...] ) ]


SELECT FormatSelect

Notació: la llista de columnes en les quals inserim va és opcional, per la qual cosa va entre
claudàtors.
En el format anterior podem destacar:
· La llista de columnes és opcional però haurà d'especificar-se quan les columnes que retorna
la consulta no coincideixen en número o en ordre amb les columnes de la taula destine.
· La consulta pot ser qualsevol comando de selecció vàlid sempre que existisca una
correspondència entre les columnes retornades i les columnes de la taula destine, o la llista de
columnes.

EXERCICIS BD JARDINERIA
Creeu les taules PedidosHistorico i DetallePedidos_historico amb els camps i les
restriccions següents que es corresponen amb els de Pedidos i DetallePedidos.
 Per a PedidosHistorico afegirem un camp, FechaIntro, on introduirem la data
actual.
 En el cas de DetallePedidos_historico, la clau aliena serà cap a
PedidosHistorico.

CREATE TABLE PedidosHistorico (


CodigoPedido integer NOT NULL,
FechaPedido date NOT NULL,
FechaEsperada date NOT NULL,
FechaEntrega date DEFAULT NULL,
CodigoCliente integer NOT NULL,
DataIntro date,
PRIMARY KEY (CodigoPedido),
CONSTRAINT pedHist_Client FOREIGN KEY (CodigoCliente)
REFERENCES Clientes (CodigoCliente)
) engine=innodb;

CREATE TABLE DetallePedidosH (


CodigoPedido integer NOT NULL,
CodigoProducto varchar(15) NOT NULL,
Cantidad integer NOT NULL,
PrecioUnidad numeric(15,2) NOT NULL,
NumeroLinea smallint NOT NULL,
PRIMARY KEY (CodigoPedido,CodigoProducto),
CONSTRAINT HDetallePedidos_PedidoFK FOREIGN KEY
(CodigoPedido) REFERENCES PedidosHistorico (CodigoPedido),
CONSTRAINT HDetallePedidos_ProductoFK FOREIGN KEY
(CodigoProducto) REFERENCES Productos (CodigoProducto)
)engine=innodb;

(Los ejercicios están en castellano porque la BD está en castellano)


1) Introducid en la tabla Empleados 3 empleados nuevos. Recordad que
tendréis que asignarlos a una OFICINA válida.

2) Introducid en la tabla CLIENTES tres clientes que estén asignados a cada


uno de los nuevos empleados creados en el ejercicio anterior.

3) Introducid en la tabla Pedidos_historico los pedidos que ya se han servido


(tienen fecha de entrega). En el campo DataIntro debe introducirse la
fecha actual (la del sistema).

4) Introducid en la tabla DetallePedidos_historico las filas de DetallePedidos


relacionadas con las filas de Pedidos_historico.

You might also like