Unidad 7. Actualización de datos (V)


7.8. Eliminar filas - DELETE

La sentencia DELETE elimina filas de una tabla. Si se borran todas las filas, o se borra la única fila de una tabla, la definición de la tabla no desaparece, sólo que la tabla se queda vacía.


   DELETE 

      [ TOP ( expression ) [  PERCENT ] ] [ FROM ] <destino>

      [ FROM <origen>]

      [ WHERE < condicion>] 

   [; ]

  <destino> ::=

    {   

      [nbBaseDatos. nbEsquema. | nbEsquema.]nbTablaVista

    } 

Con esta instrucción podemos eliminar una o varias filas de una tabla.

La palabra FROM (la primera) es opcional (originalmente era obligatorio) y no añade funcionalidad sólo sirve para introducir el destino.
<destino> es el nombre de la tabla de donde queremos eliminar las filas, puede ser un nombre de tabla o un nombre de vista (de momento basada en una sólo tabla).
La segunda cláusula FROM sirve para indicar un origen que permita una condición de WHERE sobre una tabla diferente de destino.
La instrucción básica sería pues:


DELETE oficinas;

Equivalente a:


DELETE FROM  oficinas; 

Con esta instrucción eliminamos todas las filas de la tabla oficinas.

La cláusula WHERE permite eliminar determinadas filas, indica una condición que deben cumplir las filas que se eliminan.

Por ejemplo:


DELETE oficinas

  WHERE region = ’Este’;

Elimina las oficinas del Este.


TOP ( expresion ) [ PERCENT ]  

Especifica el número o porcentaje de filas aleatorias que se van a eliminar.
expression debe generar un valor numérico e indica el número de filas a eliminar empezando por el principio. Como en la SELECT, si añadimos la palabra PERCENT, el número representado por expresión se refiere al porcentaje de filas a eliminar sobre el total. La cláusula TOP funciona casi igual que en la SELECT pero en este caso, las filas no se ordenan, y la expresión debe ir entre paréntesis.

Por ejemplo:


DELETE TOP (10) PERCENT

  FROM oficinas;

Elimina el 10% de filas de la tabla oficinas.

Originalmente sólo se podía indicar una tabla en la cláusula FROM, pero ahora podemos indicar un origen basado en varias tablas.
Si utilizamos un origen basado en varias tablas, se debe de utilizar una extensión de TRANSACT-SQL que consiste en escribir dos cláusulas FROM, una indica la tabla de donde eliminamos las filas y la otra el origen que utilizamos para eliminar.
Este caso se produce cuando las filas a eliminar dependen de un valor que está en otra tabla. Por ejemplo queremos eliminar los empleados de las oficinas del Este. Como la región de la oficina no está en empleados, habría que añadir al origen la tabla oficinas para poder formular la condición del WHERE:


DELETE FROM empleados

FROM empleados INNER JOIN oficinas 

ON empleados.oficina = oficinas.oficina

WHERE region = 'Este'; 

En el origen tenemos las dos tablas y en la primera FROM indicamos de qué tabla queremos borrar.

Esto se podía haber resuelto, como toda la vida, mediante una subconsulta:


DELETE FROM empleados

WHERE oficina IN (SELECT oficina

             FROM oficinas 

             WHERE region = 'Este');

Para finalizar no debemos olvidar que para poder ejecutar un DELETE se requieren permisos DELETE en la tabla de donde vamos a eliminar, y también se requieren los permisos para utilizar SELECT si la instrucción contiene una cláusula WHERE.

Muy importante siempre que actualicemos datos en nuestras tablas, no debemos olvidar tampoco las reglas de integridad referencial. Si la tabla afectada interviene como tabla principal en una relación con otra tabla, no se podrán eliminar sus filas que estén relacionadas con registros de la otra tabla (no se pueden eliminar ‘padres’ que tengan ‘hijos’ ). Si se van a eliminar  varias filas y al menos una no se puede eliminar por infringir las reglas de integridad, entonces la operación abortará y no se eliminará ninguna fila.

En el ejemplo anterior, si un empleado asignado a una oficina del Este tiene pedidos, no se podrá eliminar y entonces no se eliminará ningún empleado.

Para practicar puedes realizar este Ejercicio Eliminar filas con DELETE.

Febrero-2010
Pág. 7.5

Atrás  Inicio  Adelante






.