210 likes | 342 Views
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. Modificando la instancia. DML Sentencias. Agenda. INSERT UPDATE DELETE TRANSACCIONES. DML Sentencias. Agenda. Modificando la instancia. DML
E N D
Maestría en BioinformáticaBases de Datos y Sistemas de InformaciónSQL: DMLIng. Alfonso Vicente, PMPalfonso.vicente@logos.com.uy
Agenda • Modificando la instancia DML Sentencias
Agenda • INSERT • UPDATE • DELETE • TRANSACCIONES DML Sentencias
Agenda • Modificando la instancia DML Sentencias
DML • Modificando la instancia • Con el Data DefinitionLanguage (DDL) creamos y modificamos el esquema (o estructura) de la base • Con el Data Manipulation Language (DML) modificamos la instancia, esdecir: insertamos, modificamos y eliminamostuplas en lastablas • Veremos los comandos INSERT, UPDATE y DELETE de forma muysimplificada • Puedensurgirerroresporintentarviolarcualquier constraint definida: Tipo de datos, NOT NULL, CHECK, PK, UK o FK
Agenda • INSERT • UPDATE • DELETE • TRANSACCIONES DML Sentencias
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 • NameNull? Type • ------------------------ -------- ---------------------------- • SIMBOLO NOT NULL CHAR(2) • NOMBRE NOT NULL VARCHAR2(20) • NUMERO_ATOMICO NUMBER(10,2) • SQL> insertinto elementos values ('He', null, null); • insertinto elementos values ('He', null, null) • * • ERROR at line 1: • ORA-01400: cannotinsert NULLinto ("ALFONSO"."ELEMENTOS"."NOMBRE")
Sentencias INSERT SQL> insertinto elementos values ('He', 'Helio', 'desconozco'); insertinto elementos values ('He', 'Helio', 'desconozco') * ERROR at line 1: ORA-01722: invalidnumber SQL> insertinto elementos values ('H', 'Hidrogeno', 1); insertinto elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: uniqueconstraint(ALFONSO.SYS_C0029000) violated SQL> insertintoelementos_moleculavalues ('C', 'Metano', 1); insertintoelementos_moleculavalues ('C', 'Metano', 1) * ERROR at line 1: ORA-02291: integrityconstraint(ALFONSO.FK_MOLECULAS_ELEMENTOS) violated - parentkeynotfound
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: isnull, isnotnull • 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' wheresimbolo = 'H'; • update elementos set simbolo = 'Z' wheresimbolo = 'H' • * • ERROR at line 1: • ORA-02292: integrityconstraint(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 integrityconstraintviolated - 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> createtable cuentas ( • 2 cuenta integernotnullprimarykey, • 3 saldo number(10, 2) notnull • 4 ); • Tablecreated. • SQL> alter table cuentas addconstraintcheck_saldo_positivo • 2 check ( saldo >= 0); • Tablealtered. • SQL> insertinto cuentas values (15263, 400); • 1 rowcreated. • 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: checkconstraint(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