DML - Pedeciba

Anuncio
Maestría en Bioinformática
Bases de Datos y Sistemas de Información
SQL: DML
Ing. Alfonso Vicente, PMP
alfonso.vicente@logos.com.uy
Agenda
DML
Sentencias
 Modificando la instancia
Agenda
DML
Sentencias




INSERT
UPDATE
DELETE
TRANSACCIONES
Agenda
DML
Sentencias
 Modificando la instancia
DML
Modificando la instancia
• Con el Data Definition Language (DDL) creamos y
modificamos el esquema (o estructura) de la base
• Con el Data Manipulation Language (DML) modificamos la
instancia, es decir: insertamos, modificamos y eliminamos
tuplas en las tablas
• Veremos los comandos INSERT, UPDATE y DELETE de
forma muy simplificada
• Pueden surgir errores por intentar violar cualquier constraint
definida: Tipo de datos, NOT NULL, CHECK, PK, UK o FK
Agenda
DML
Sentencias




INSERT
UPDATE
DELETE
TRANSACCIONES
Sentencias
INSERT
• Permite insertar nuevas tuplas en una tabla existente
INSERT INTO <nombre_tabla> (col1, col2, ..., colN)
VALUES (val1, val2, ..., valN);
• Ejemplo:
INSERT INTO elementos (simbolo, nombre)
VALUES ('H', 'Hidrogeno');
INSERT INTO moleculas (nombre, carga)
VALUES ('Agua', 0);
INSERT INTO elementos_molecula (elemento, molecula, numero)
VALUES ('H', 'Agua', 2);
Sentencias
INSERT
• Si se omite el nombre de una columna, se insertará NULL
en esa columna
• Si no se especifican las columnas, se asume que en la
cláusula VALUES vendrán los valores para todas las
columnas en el orden en que fueron definidas en la tabla
• Se considera una buena práctica especificar siempre las
columnas en el INSERT
• Habrá valores nuevos donde antes no había: el RDBMS
debe verificar la integridad
Sentencias
INSERT
• Ejemplos de error
SQL> desc elementos
Name
-----------------------SIMBOLO
NOMBRE
NUMERO_ATOMICO
Null?
-------NOT NULL
NOT NULL
Type
---------------------------CHAR(2)
VARCHAR2(20)
NUMBER(10,2)
SQL> insert into elementos values ('He', null, null);
insert into elementos values ('He', null, null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("ALFONSO"."ELEMENTOS"."NOMBRE")
Sentencias
INSERT
SQL> insert into elementos values ('He', 'Helio', 'desconozco');
insert into elementos values ('He', 'Helio', 'desconozco')
*
ERROR at line 1:
ORA-01722: invalid number
SQL> insert into elementos values ('H', 'Hidrogeno', 1);
insert into elementos values ('H', 'Hidrogeno', 1)
*
ERROR at line 1:
ORA-00001: unique constraint (ALFONSO.SYS_C0029000) violated
SQL> insert into elementos_molecula values ('C', 'Metano', 1);
insert into elementos_molecula values ('C', 'Metano', 1)
*
ERROR at line 1:
ORA-02291: integrity constraint (ALFONSO.FK_MOLECULAS_ELEMENTOS)
violated - parent key not found
Sentencias
UPDATE
• Permite modificar tuplas existentes en una tabla existente
UPDATE <nombre_tabla>
SET col1 = val1, col2 = val2, ..., colN = valN
WHERE <predicado>;
• Ejemplo:
UPDATE elementos
SET nombre = 'Hidrógeno‘
WHERE nombre = 'Hidrogeno‘;
Sentencias
UPDATE
• Todas las tuplas que cumplen el predicado se modifican con
los valores del set
• El predicado (por ahora) debe versar sobre las columnas de
la tabla, y puede contener:
• Comparaciones simples: =, <, >, <>
• Comparaciones por rango: between
• Expresiones regulares: like
• Comparación con null: is null, is not null
• Expresiones lógicas: AND, OR, NOT
Sentencias
UPDATE
• Como en el INSERT, pueden ocurrir errores porque habrá
valores nuevos donde antes no había, pero además, valores
que existen pueden dejar de existir
• Un UPDATE podría modificar el padre de una FK definida
con la cláusula “ON UPDATE RESTRICT”
SQL> update elementos set simbolo = 'Z' where simbolo = 'H';
update elementos set simbolo = 'Z' where simbolo = 'H'
*
ERROR at line 1:
ORA-02292: integrity constraint (ALFONSO.FK_MOLECULAS_ELEMENTOS)
violated - child record found
Sentencias
DELETE
• Permite eliminar tuplas de una tabla existente
DELETE FROM <nombre_tabla>
WHERE <predicado>;
• Ejemplo:
DELETE FROM elementos WHERE simbolo = 'H';
DELETE FROM movimientos WHERE fecha_mov < '15/05/2002';
• Posibilidad de integrity constraint violated - child record
found en FKs con la cláusula “ON DELETE RESTRICT”
Sentencias
UPDATE y DELETE
• Cuidado con los predicados: un predicado mal escrito puede
modificar (o eliminar) tuplas que no se pretendían modificar
(o eliminar)
• El predicado vacío se evalúa TRUE para todas las tuplas !
UPDATE elementos set simbolo = 'H';
DELETE FROM elementos;
• ¿Qué hacemos si nos equivocamos?
Sentencias
TRANSACCIONES
• Los RDBMS implementan transacciones ACID
• Atomicity (se hacen en su totalidad o no se hacen)
UPDATE cuentas set saldo = saldo-500 where cuenta = 15263;
UPDATE cuentas set saldo = saldo+500 where cuenta = 9935;
INSERT INTO transferencias (fecha, desde, hacia, monto)
VALUES (SYSDATE, 15263, 9935, 500);
COMMIT; -- Aquí se confirma la transacción
Sentencias
TRANSACCIONES
• Los RDBMS implementan transacciones ACID
• Consistency (cualquier intento de violar una constraint
termina en un error)
• Isolation (mientras la transacción no se confirmó
mediante COMMIT nadie más ve los datos intermedios y
las transacciones no se afectan unas a otras)
• Durability (después del COMMIT los cambios perduran)
Sentencias
TRANSACCIONES
• ¿Qué sucede si nos equivocamos u obtenemos un error?
SQL> create table cuentas (
2
cuenta integer not null primary key,
3
saldo number(10, 2) not null
4 );
Table created.
SQL> alter table cuentas add constraint check_saldo_positivo
2 check ( saldo >= 0);
Table altered.
SQL> insert into cuentas values (15263, 400);
1 row created.
SQL> commit;
Commit complete.
Sentencias
TRANSACCIONES
• ¿Qué sucede si nos equivocamos u obtenemos un error?
SQL> UPDATE cuentas set saldo = saldo-500 where cuenta = 15263;
UPDATE cuentas set saldo = saldo-500 where cuenta = 15263
*
ERROR at line 1:
ORA-02290: check constraint (ALFONSO.CHECK_SALDO_POSITIVO)
violated
• No podemos continuar la transacción
SQL> rollback;
Rollback complete.
Sentencias
TRANSACCIONES
• Algunos RDBMSs tienen un modo autocommit, donde cada
sentencia termina con un commit implícito
• Todos tienen el modo opuesto, donde hay transacciones
• Las transacciones comienzan / terminan:
• Al iniciar la sesión
• Al ejecutar commit / rollback
• Al ejecutar DDLs o algunos comandos (según RDBMS)
• Al terminar la sesión
Sentencias
LOCKING
• Es la forma general de lograr Isolation, cuando hay
competencia por los mismos recursos
Sesión 1
Sesión 2
SQL> UPDATE cuentas
2 set saldo = saldo – 200
3 where cuenta = 15263;
1 row updated.
SQL> UPDATE cuentas
2 set saldo = saldo – 200
3 where cuenta = 15263;
lock wait
Descargar