SQL · Capítulo 13 · Lección de conceptos · 6 min de lectura

Cambiar datos con seguridad significa trabajar sobre una copia

INSERT, UPDATE y DELETE actúan al instante sobre cada fila que su WHERE coincide. El hábito seguro es crear una copia, previsualizar las filas que tocará el cambio, cambiar la copia y comprobar el resultado con una consulta.

La idea

Hasta ahora cada consulta leía datos. INSERT, UPDATE, DELETE y CREATE TABLE los cambian. Son instrucciones cortas, y actúan al instante: un UPDATE cambia cada fila que su WHERE coincide, un DELETE las quita, y no hay un "¿estás seguro?" de por medio.

Así que la habilidad no es la sintaxis. Es el hábito alrededor: cambiar una copia en lugar del original, mirar qué filas se tocarán antes de tocarlas, y comprobar después que la tabla dice lo que crees.

Figura 1

UPDATE cambia exactamente las filas que coinciden con su WHERE

staging_products
product_idcategoryunit_price
156Kitchen53.99
183Decor189.00
216Outdoor379.00
Después de UPDATE … SET unit_price = ROUND(unit_price * 1.10, 2) WHERE category = 'Kitchen'
product_idcategoryunit_price
156Kitchen59.39
183Decor189.00
216Outdoor379.00
El mismo UPDATE con el WHERE olvidado
product_idcategoryunit_price
156Kitchen59.39
183Decor207.90
216Outdoor416.90

Paso 1 de 4 Una copia de trabajo con tres productos. El plan: subir un 10% los precios de Kitchen.

  1. Una copia de trabajo con tres productos. El plan: subir un 10% los precios de Kitchen.
  2. Primero ejecuta el WHERE como un SELECT. Devuelve una fila, el portacuchillos. Ese es el número de filas que esperas que cambie el UPDATE.
  3. Ahora el UPDATE. Solo cambia la fila coincidente: 53.99 pasa a 59.39. Las demás filas no se tocan.
  4. Sin el WHERE, todas las filas coinciden. Decor y Outdoor también suben, y no hay deshacer fuera de una transacción. Por eso la previsualización va primero.

Por qué existe

Los analistas construyen tablas más a menudo de lo que esperan. Una copia de trabajo de los pedidos del año pasado para limpiarla antes de un informe. Una tabla de resumen que un panel lee cada mañana. Una tabla de importación para la lista de precios de un proveedor, que llega como archivo y tiene que volverse filas. Cada una necesita que exista una tabla (CREATE TABLE), datos dentro (INSERT, o CREATE TABLE AS SELECT), correcciones (UPDATE, DELETE) y a veces una columna nueva (ALTER TABLE).

La otra razón es el riesgo. Leer datos no puede dañar nada. Escribirlos sí, y en una base de datos real un UPDATE equivocado sobre la tabla en producción afecta a quien la lea después. Aprender el patrón seguro en un entorno de práctica es lo que te permite usarlo sin miedo en el trabajo.

Cómo funciona por dentro

Dos familias de instrucciones

DDL (definición de datos) cambia la estructura: CREATE TABLE, ALTER TABLE, DROP TABLE. Al crear una tabla eliges el nombre y el tipo de cada columna: INTEGER, DECIMAL(10,2), VARCHAR, DATE. El tipo es una promesa sobre lo que la columna puede contener, y la base de datos la hace cumplir, por eso cargar '$1,299.00' en una columna decimal falla.

DML (manipulación de datos) cambia las filas: INSERT, UPDATE, DELETE. Cada una informa cuántas filas tocó. Ese número es la mejor comprobación que tienes.

INSERT y CREATE TABLE AS

INSERT INTO t (a, b) VALUES (…) agrega las filas que escribes, y INSERT INTO t SELECT … agrega las filas que devuelve una consulta. CREATE TABLE t AS SELECT … hace ambas cosas en un paso: crea una tabla con la forma del resultado de la consulta y la llena. Es la forma habitual de sacar una instantánea de los datos. La tabla nueva toma los tipos de columna de la consulta, así que revísalos, y ten en cuenta que no copia claves ni valores por defecto de la fuente.

UPDATE y DELETE actúan sobre las coincidencias

Ambos llevan un WHERE. Las filas que coinciden se cambian o se quitan, y las que no coinciden se dejan en paz. Sin WHERE, todo coincide.

De ahí el hábito de previsualizar: escribe primero el WHERE como un SELECT.

Figura 2

DELETE, TRUNCATE y DROP quitan cosas distintas

staging_lines
order_item_idquantity
1392
1210-4
15810
3634-1
DELETE … WHERE quantity <= 0
order_item_idquantity
1392
TRUNCATE staging_lines (la tabla queda, las filas no)
order_item_idquantity

Paso 1 de 4 Una tabla de trabajo con tres líneas malas: cantidades -4, 0 y -1. En todos los datos de la tienda hay 24 líneas así.

  1. Una tabla de trabajo con tres líneas malas: cantidades -4, 0 y -1. En todos los datos de la tienda hay 24 líneas así.
  2. DELETE … WHERE quantity <= 0 quita las filas que coinciden y conserva las demás. Queda una línea buena.
  3. TRUNCATE quita todas las filas de golpe y conserva la tabla con sus columnas y tipos, lista para llenarse otra vez.
  4. DROP TABLE quita la tabla misma, definición y filas. No queda nada que consultar, que es lo que quieres para una tabla de pruebas y un desastre para la tabla equivocada.

DELETE quita algunas o todas las filas y se puede deshacer dentro de una transacción. TRUNCATE vacía toda la tabla rápidamente y conserva su estructura. DROP quita la tabla. Elige según lo que quieras que quede.

ALTER TABLE

ALTER TABLE t ADD COLUMN c DECIMAL(10,2) agrega una columna. Las filas existentes reciben NULL en ella hasta que la llenes con un UPDATE, así que una secuencia típica es agregar la columna, rellenarla a partir de un cálculo y luego comprobar que no queden NULL.

Los tipos y las restricciones te protegen

Cuando creas una tabla, los tipos de columna son tu primera línea de defensa, y las restricciones la segunda. NOT NULL rechaza una fila sin valor, PRIMARY KEY rechaza un id repetido, y CHECK (quantity > 0) habría rechazado las 24 líneas de pedido malas antes de que entraran. Una instrucción que rompe una regla falla sin cambiar nada, lo cual es mucho mejor que cargarla y limpiar después. Elige DECIMAL(10,2) para el dinero en lugar de un tipo de coma flotante, para que los centavos no se desvíen, y DATE o TIMESTAMP para las fechas en lugar de texto, para poder ordenarlas y restarlas.

Lee el conteo de filas

Cada INSERT, UPDATE y DELETE devuelve el número de filas que afectó. Trátalo como el resultado de una prueba. Si esperabas las 24 líneas malas y la base de datos dice 2,400, detente e investiga. Si dice 0, tu WHERE no coincidió con nada, a menudo por las mayúsculas o un espacio sobrante. El conteo es gratis y es lo más útil que te dice un cambio de datos.

Transacciones

Una transacción agrupa instrucciones para que surtan efecto juntas o no surtan efecto: COMMIT las conserva, ROLLBACK las deshace. En este curso cada ejecución va envuelta en una transacción que se deshace, así que las tablas de la tienda siempre se restauran. En una base de datos real, muchas herramientas confirman automáticamente, así que no supongas que puedes deshacer.

El flujo de trabajo

Figura 3

De la pregunta a la respuesta verificada

  1. CREATE TABLE staging AS SELECT … trabaja sobre una copia
  2. SELECT … WHERE … mira las filas primero
  3. UPDATE / DELETE … cambia la copia
  4. SELECT COUNT(*), SUM(…) compara con el antes
  5. CREATE TABLE report AS … la tabla que lee la gente

Paso 1 de 5 Copia los datos que necesitas en una tabla de trabajo. El original queda intacto, así que un error te cuesta la copia, no la fuente.

  1. Copia los datos que necesitas en una tabla de trabajo. El original queda intacto, así que un error te cuesta la copia, no la fuente.
  2. Escribe el WHERE como un SELECT y mira las filas y el conteo. Si el conteo no es el que esperabas, detente aquí.
  3. Ejecuta el UPDATE o el DELETE con el mismo WHERE. La base de datos informa cuántas filas cambió, y debe coincidir con la previsualización.
  4. Consulta el resultado: conteos de filas, totales, un par de filas a ojo. Compara con los números de antes del cambio.
  5. Solo entonces construye la tabla que leerá otra gente, y di qué contiene.

El mismo ciclo vale si limpias un archivo de proveedor o publicas un resumen mensual: copiar, previsualizar, cambiar, verificar, publicar. Verificar es una consulta, no una sensación. Compara los conteos y los totales con lo que tenías antes, y mira las filas de los bordes que esperabas que cambiaran.

Errores comunes

"Voy a tener cuidado, así que no necesito previsualizar"

El cuidado no te muestra qué filas coincide una condición. Un WHERE con OR mezclado con AND, o una comparación de texto que difiere en mayúsculas, coincide con filas que no imaginabas. La previsualización muestra las filas reales, y el conteo muestra el tamaño del cambio.

"DELETE y TRUNCATE hacen lo mismo"

Ambos vacían filas, pero DELETE admite un WHERE, se registra fila por fila y se puede deshacer en una transacción. TRUNCATE no admite WHERE y está hecho para limpiar toda la tabla. Ninguno quita la tabla, eso es DROP.

"CREATE TABLE AS copia la tabla"

Copia el resultado de una consulta: las filas y los tipos de columna, no la clave primaria, los índices ni los valores por defecto. Si una copia los necesita, crea la tabla con una definición completa y luego usa INSERT INTO … SELECT.

Ponte a prueba

Una pregunta. Al responderla, la lección queda marcada en el mapa; nunca bloquea un nivel.

Debes borrar de tu copia de trabajo las 24 líneas de pedido con cantidad 0 o menor. ¿Cuál es el orden de pasos más seguro?

Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.