Вы находитесь на странице: 1из 20

Agenda

DML  Modificando la instancia


Sentencias
Agenda

DML  INSERT
Sentencias  UPDATE
 DELETE
 TRANSACCIONES
Agenda

DML  Modificando la instancia


Sentencias
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  INSERT
Sentencias  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 Null? Type
------------------------ -------- ----------------------------
SIMBOLO NOT NULL CHAR(2)
NOMBRE NOT NULL VARCHAR2(20)
NUMERO_ATOMICO 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

Вам также может понравиться