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
| product_id | category | unit_price |
|---|---|---|
| 156 | Kitchen | 53.99 |
| 183 | Decor | 189.00 |
| 216 | Outdoor | 379.00 |
| product_id | category | unit_price |
|---|---|---|
| 156 | Kitchen | 59.39 |
| 183 | Decor | 189.00 |
| 216 | Outdoor | 379.00 |
| product_id | category | unit_price |
|---|---|---|
| 156 | Kitchen | 59.39 |
| 183 | Decor | 207.90 |
| 216 | Outdoor | 416.90 |
- Una copia de trabajo con tres productos. El plan: subir un 10% los precios de Kitchen.
- Primero ejecuta el
WHEREcomo unSELECT. Devuelve una fila, el portacuchillos. Ese es el número de filas que esperas que cambie elUPDATE. - Ahora el
UPDATE. Solo cambia la fila coincidente: 53.99 pasa a 59.39. Las demás filas no se tocan. - 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
| order_item_id | quantity |
|---|---|
| 139 | 2 |
| 1210 | -4 |
| 1581 | 0 |
| 3634 | -1 |
| order_item_id | quantity |
|---|---|
| 139 | 2 |
| order_item_id | quantity |
|---|
- 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í.
DELETE … WHERE quantity <= 0quita las filas que coinciden y conserva las demás. Queda una línea buena.TRUNCATEquita todas las filas de golpe y conserva la tabla con sus columnas y tipos, lista para llenarse otra vez.DROP TABLEquita 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
-
CREATE TABLE staging AS SELECT …trabaja sobre una copia -
SELECT … WHERE …mira las filas primero -
UPDATE / DELETE …cambia la copia -
SELECT COUNT(*), SUM(…)compara con el antes -
CREATE TABLE report AS …la tabla que lee la gente
- 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.
- Escribe el
WHEREcomo unSELECTy mira las filas y el conteo. Si el conteo no es el que esperabas, detente aquí. - Ejecuta el
UPDATEo elDELETEcon el mismoWHERE. La base de datos informa cuántas filas cambió, y debe coincidir con la previsualización. - Consulta el resultado: conteos de filas, totales, un par de filas a ojo. Compara con los números de antes del cambio.
- 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.
No del todo. Cuando ves el conteo, las filas ya no están. Cuenta primero, para que el número que informe el DELETE sea uno que ya esperabas.Prueba otra respuesta.
No del todo. Eso funciona pero quita todo y luego depende de que recuerdes qué filas reinsertar. Un DELETE previsualizado es más pequeño y verificable.Prueba otra respuesta.
Correcto. La previsualización te dice exactamente cuántas filas coinciden con el WHERE. Si el DELETE también informa 24, el cambio hizo lo que querías.
No del todo. Reconstruir está bien para una copia de pruebas, pero tira la definición de la tabla y cuesta una recarga completa. Es más pesado de lo necesario para borrar unas pocas filas.Prueba otra respuesta.
Lección hecha: ya está marcada en el mapa.