Maestría en Bioinformática Bases de Datos y Sistemas de Información SQL: DML Ing. Alfonso Vicente, PMP [email protected] 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