- ¿Cómo se desarrolla una eliminación en MySQL?
R: Recuperemos la tabla fichajes y observemos su
contenido:
mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha | entrada | salida
|
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL
|
| 2012-07-05 | 07:45:00 | NULL
|
| 2012-07-06 | 07:30:00 | NULL
|
| 2012-07-07 | 07:15:00 | NULL
|
| 2012-07-08 | 08:01:00 | NULL
|
+------------+----------+----------+
8 rows in set (0.00 sec)
Queremos eliminar el registro del día 7 de julio. MySQL pone a nuestra
disposición el comando DELETE, que usaremos del siguiente modo:
DELETE FROM tabla WHERE condición
Algo que podríamos leer como “borra de la tabla indicada aquello que
cumpla cierta condición”.
¿Cuál es la condición que determinará que se borre el registro? Que el
campo fecha tenga por valor ’2012-07-07′. Así pues:
mysql> DELETE FROM fichajes WHERE fecha =
'2012-07-07';
Query OK, 1 row affected (0.14 sec)
Constatemos que el comando ha cumplido su misión:
mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha | entrada | salida
|
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL
|
| 2012-07-05 | 07:45:00 | NULL
|
| 2012-07-06 | 07:30:00 | NULL
|
| 2012-07-08 | 08:01:00 | NULL
|
+------------+----------+----------+
7 rows in set (0.00 sec)
Como puedes comprobar, el registro de fecha 7 de julio ha sido eliminado
de la tabla.
Es necesario que extremes la precaución siempre que uses DELETE. Si la
condición de la claúsula WHERE se cumple en varios registros, serán eliminados
todos ellos.
Por eso, una buena práctica consiste en ejecutar previamente un comando
SELECT, bajolos mismos términos, para obtener el listado de registros
afectados.
Imagina, por ejemplo, que queremos eliminar de la tabla fichajes los
registros cuya hora de entrada sea superior o igual a las 7:45. Antes de
proceder con el comando DELETE es interesante asegurarnos de que los registros
que se van a borrar son precisamente los que queremos:
mysql> SELECT * FROM fichajes WHERE entrada
>= '07:45:00';
+------------+----------+----------+
| fecha
| entrada | salida |
+------------+----------+----------+
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-05 | 07:45:00 | NULL |
| 2012-07-08 | 08:01:00 | NULL |
+------------+----------+----------+
3 rows in set (0.00 sec)
Observa el uso de la claúsula WHERE también en la sentencia SELECT para
filtrar las filas a presentar.
Comprobamos que, efectivamente, esos son los únicos registros que
deseamos eliminar. Podemos lanzar ya DELETE sin miedo:
mysql> DELETE FROM fichajes WHERE entrada >= '07:45:00';
Query OK, 3 rows affected (0.03 sec)
Así es como queda nuestra tabla tras esta eliminación:
mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha | entrada | salida
|
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL
|
| 2012-07-06 | 07:30:00 | NULL
|
+------------+----------+----------+
4 rows in set (0.00 sec)
¿Y si quisiéramos eliminar todos los registros de la tabla fichajes?
Exactamente igual, con la salvedad de que sobra el WHERE, pues no hay
nada que filtrar, ya que no se salvará ninguno:
mysql> DELETE FROM fichajes;
Query OK, 4 rows affected (0.04 sec)
Así de simple.
mysql> SELECT * FROM fichajes;
Empty set (0.01 sec)
Nada que presentar, la tabla está más pelada que el ropero de Tarzán.
Utilizaremos la claúsula WHERE condición en numerosos contextos.
Considera el artículo de hoy como un pequeño barniz…