sql >> Base de Datos >  >> RDS >> Database

SQL DELETE para principiantes

Este artículo contiene SQL básico DELETE declaraciones que los principiantes pueden usar para eliminar datos de sus tablas de base de datos.

Eliminar una sola fila

Aquí hay un ejemplo básico de SQL DELETE declaración.

DELETE FROM Owners
WHERE OwnerId = 5;

En este caso eliminamos la fila donde se encuentra el OwnerId la columna tiene un valor de 4 .

El DELETE declaración comienza con DELETE FROM , seguido del nombre de la tabla (es decir, la tabla que contiene los datos que desea eliminar).

En algunos sistemas de gestión de bases de datos (DBMS), FROM La palabra clave es opcional, pero es una buena idea incluirla para una mejor portabilidad (en caso de que necesite ejecutar el mismo código en un DBMS diferente).

Siempre debe incluir un WHERE cláusula, a menos que desee eliminar todas las filas de la tabla.

Sí, lo leiste bien. Omitir el WHERE la cláusula eliminará todas las filas de la tabla.

La mayoría de los DBMS tienen otras opciones que puede usar con DELETE declaración, pero las que se enumeran aquí son las más utilizadas.

Tenga en cuenta que DELETE declaración elimina toda la fila. No puede eliminar el valor de una columna individual dentro de una fila. Para hacer esto, use SQL UPDATE declaración.

Ejemplo

En este ejemplo, eliminamos datos de una tabla.

En primer lugar, veamos qué hay en la tabla.

SELECT * FROM Owners;

Resultado:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

OK, eliminemos el propietario número 5, luego seleccionemos la tabla nuevamente.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Resultado:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Podemos ver que la última fila se ha eliminado como se especifica.

Claves foráneas

Puede obtener un error si intenta eliminar datos a los que hace referencia una clave externa en otra tabla. Esto se debe a que la tabla de la que intenta eliminar datos es la tabla principal en una relación. La tabla con la clave externa (la tabla secundaria) se basa en los datos de la tabla principal (es decir, los datos que intenta eliminar).

Si obtiene un error o no, dependerá de cómo se configuró la clave externa. La mayoría de los DBMS admiten varias opciones para hacer frente a esta situación. Dichas opciones podrían incluir generar un error, eliminar en cascada la tabla de clave externa (es decir, eliminar la fila de la tabla secundaria), establecer la clave externa en NULL , o establecerlo en su valor predeterminado.

Este es un ejemplo de intentar eliminar una fila a la que hace referencia una clave externa.

DELETE FROM Owners
WHERE OwnerId = 3;

Resultado:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'.

The statement has been terminated.

En este caso, se generó un error y la fila no se eliminó.

En este ejemplo, Owners.OwnerId columna es la clave principal de esta tabla. Otra tabla llamada Pets tiene un OwnerId columna que hace referencia a esta columna de clave principal y, en este caso, hay al menos una fila que hace referencia al propietario número 3.

Si realmente quisiera eliminar esta fila, necesitaría actualizar los datos en la tabla secundaria para que ninguna fila apunte a este propietario. O eso, o modificar la clave externa para que use una opción diferente cuando se produzcan operaciones de eliminación en la clave principal. Modificar una clave externa podría ser una opción no deseada, dependiendo de lo que necesite hacer. Dependiendo de su DBMS, también puede requerir eliminar la clave existente y volver a crearla.

En cualquier caso, este error es bueno, porque nos alerta de un problema que tendremos si eliminamos esta fila. Ayuda a hacer cumplir la integridad referencial.

¡Precaución! Olvidando el WHERE Cláusula

El DELETE declaración puede ser una declaración muy peligrosa. Si omite el WHERE cláusula, eliminará todos filas en la tabla.

Afortunadamente, es posible que las restricciones de clave externa lo salven si intenta eliminar datos de la tabla principal de una relación.

Pero qué pasa si no lo es. ¿Qué sucede si sus declaraciones de eliminación no generan errores?

¡Vamos a averiguar!

Ejecutemos otro DELETE declaración, pero esta vez nos olvidaremos de incluir el WHERE cláusula. Además, esta vez lo ejecutaremos en una tabla que no es un padre en una relación.

Primero, veamos qué hay en la tabla.

SELECT * FROM Pets;

Resultado:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Bien, entonces tenemos ocho mascotas. De hecho, podemos ver que tres mascotas pertenecen al propietario número 3, el propietario que intentamos eliminar en el ejemplo anterior. Es por eso que recibimos el error.

De todos modos, sigamos adelante y ejecutemos nuestro DELETE sentencia sin WHERE cláusula, luego verifique la tabla nuevamente

DELETE FROM Pets;

SELECT * FROM Pets;

Resultado:

(8 rows affected)
(0 rows affected)

El (8 rows affected) part significa que se eliminaron ocho filas.

El (0 rows affected) parte significa que no se seleccionaron filas (porque no hay filas en la tabla.

¡Uy!

Puede haber ocasiones en las que de hecho necesite eliminar todas las filas de la tabla. Dependiendo del tamaño de la tabla, esta declaración será todo lo que necesita.

Si necesita eliminar una tabla más grande, también hay TRUNCATE TABLE , que elimina todas las filas de una tabla o particiones específicas de una tabla, sin registrar las eliminaciones de filas individuales (el DELETE declaración registra estas eliminaciones).

Por lo tanto, TRUNCATE TABLE es más rápido y utiliza menos recursos del registro de transacciones y del sistema.

Ejemplo de uso de TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Tenga en cuenta que es posible que esto no funcione si una restricción de clave externa hace referencia a la tabla, incluso si no hay filas secundarias. En tales casos, DELETE puede funcionar en su lugar.