La base de datos: de CREATE a DROP
En resumen: CREATE DATABASE crea una base de datos nueva en un servidor, mientras que DELETE, TRUNCATE, DROP TABLE y DROP DATABASE eliminan filas, todas las filas, una tabla o la base de datos entera.
Problema
El almacén quiere su propia base de datos
La tienda abre un almacén. El almacén tiene sus propias tablas: estantes, entregas, recuentos de existencias. No forman parte del sitio web, y nadie quiere que un error del almacén detenga los pedidos. Así que el almacén recibe su propia base de datos, separada, en el mismo servidor.
Hasta ahora solo has trabajado en la base de datos de la tienda. Ahora verás toda la vida de una base de datos: cómo se crea, cómo te conectas a ella, cómo se llena y cómo se elimina.
La idea
Un servidor, muchas bases de datos
Un servidor de bases de datos (PostgreSQL, MySQL, SQL Server) contiene muchas bases de datos. Cada una tiene sus propias tablas, sus propios usuarios y permisos. Una base de datos nueva se crea con CREATE DATABASE:
-- PostgreSQLCREATE DATABASE warehouse;\c warehouse -- psql se conecta a la base nueva
-- MySQLCREATE DATABASE warehouse;USE warehouse; -- las consultas siguientes se ejecutan en ellaEstos comandos no funcionan en los campos de aquí, porque el sitio usa SQLite. SQLite no tiene servidor: una base de datos es un archivo. Una base nueva es un archivo nuevo: sqlite3 warehouse.db en la terminal lo crea si no existe. Por eso SQLite no tiene CREATE DATABASE.
¿Qué base de datos usa ahora el campo? main es la base de datos de la tienda:
La idea
Una base nueva en SQLite: ATTACH
Dentro de una conexión que ya está abierta, SQLite adjunta otra base de datos con ATTACH. En una computadora escribes un nombre de archivo (ATTACH 'warehouse.db' AS warehouse) y el archivo se crea si no existe. En el navegador usamos ':memory:': una base nueva y vacía en memoria que desaparece con el campo. El nombre después de AS es el nombre de la base de datos, y sus tablas se escriben con él delante:
La tabla shelves está en la base warehouse, no en la tienda. Cómo se escriben exactamente las columnas en CREATE TABLE está en la lección siguiente. Aquí importa a dónde van.
Míralo
Una consulta entre dos bases de datos
En SQLite y MySQL una consulta puede leer de dos bases de datos a la vez. Los estantes están en el almacén, y los nombres y las existencias en la tienda:
main.products es la tabla de la tienda. main. se puede omitir: para una tabla sin nombre de base de datos SQLite busca en la base temporal, luego en main y solo después en las adjuntas. En PostgreSQL esto no funciona: una consulta ve solo la base de datos a la que está conectada. Allí las partes separadas de un sistema se dividen en esquemas dentro de una base (warehouse.shelves es el esquema warehouse), y las bases de datos separadas están realmente separadas.
Pruébalo
La base de datos del almacén
Crea la base de datos warehouse (en memoria), en ella una tabla deliveries con las columnas id (clave primaria), product_id y quantity (números enteros, obligatorias) y registra una entrega: 40 unidades del producto 12.
Solución
ATTACH ':memory:' AS warehouse;
CREATE TABLE warehouse.deliveries (
id INTEGER PRIMARY KEY,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL
);
INSERT INTO warehouse.deliveries (product_id, quantity) VALUES (12, 40);ATTACH ':memory:' AS warehouse, luego CREATE TABLE warehouse.deliveries (…) y INSERT INTO warehouse.deliveries …. Sin warehouse. delante del nombre la tabla va a main, es decir, a la base de datos de la tienda, y el almacén queda vacío. Es el error más común con varias bases de datos.
La idea
Cuatro formas de quitar
De lo más pequeño a lo más grande:
DELETE FROM t WHERE …quita las filas elegidas. SinWHEREquita todas, pero la tabla se queda.TRUNCATE TABLE t(PostgreSQL, MySQL, SQL Server) quita todas las filas de una vez, mucho más rápido queDELETEen una tabla grande. En MySQL y SQL Server también reinicia la numeración deid, y en PostgreSQL solo conTRUNCATE TABLE t RESTART IDENTITY. SQLite no tieneTRUNCATE: allíDELETE FROM tsinWHEREhace lo mismo de forma rápida.DROP TABLE tquita la tabla misma: las filas, las columnas, sus índices. Despuéstya no existe.DROP DATABASE warehousequita la base de datos entera con todas sus tablas. En SQLite esto es borrar el archivo.
Aquí DELETE vacía la tabla de promociones, y DROP TABLE la quita. La última consulta no tiene nada que leer:
Más precisamente, para curiosos
DROP no pregunta «¿seguro?» y no se deshace con Ctrl+Z. En PostgreSQL DROP DATABASE no funciona mientras alguien esté conectado a la base, y en PostgreSQL y SQLite un DROP TABLE dentro de una transacción se puede deshacer con ROLLBACK. En MySQL DROP y TRUNCATE hacen un COMMIT por su cuenta. Por eso, antes de un DROP en una base de datos real, primero haces una copia (para eso está la lección sobre el sitio real en el módulo «La base de datos en el programa»).
Pruébalo
Una tabla de una importación antigua
La tabla promo_import quedó de una importación de promociones y ya no hace falta. Elimínala junto con los datos, de modo que el script no se detenga si alguien ya la quitó.
Solución
DROP TABLE IF EXISTS promo_import;DROP TABLE IF EXISTS promo_import. DELETE FROM promo_import deja la tabla vacía en pie, y sin IF EXISTS el segundo intento se detiene con «no such table».
Ejercicio
Vaciar, pero conservar
La tabla cart_log registra lo que los clientes ponen en el carrito. Al principio de cada mes se vacía, pero se queda para los registros nuevos. Vacíala.
Solución
DELETE FROM cart_log;DELETE FROM cart_log sin WHERE (en PostgreSQL y MySQL sería TRUNCATE TABLE cart_log). DROP TABLE quitaría también la tabla, y el siguiente registro del sitio se detendría con «no such table».
La idea
Desadjuntar
Cuando ya no la necesitas, la base de datos se desadjunta con DETACH. El archivo se queda en el disco, y sus tablas ya no se ven desde esta conexión:
El camino completo de una base de datos es: crearla (CREATE DATABASE, en SQLite un archivo nuevo o ATTACH), conectarse (\c, USE, ATTACH), tablas (CREATE TABLE, la lección siguiente), datos (INSERT, UPDATE, DELETE), consultas (SELECT) y por último eliminar (DROP TABLE, DROP DATABASE). El proyecto del final del curso recorre todo el camino con la tienda.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Clave primaria y clave foránea · JOIN: dos tablas en una consulta · INSERT: insertar filas · DELETE: borrar filas
- Continúa en: La panadería, etapa 1: la base de datos y las tablas · La panadería, etapa 6: el informe, la copia y DROP
- Ejercicios sobre el tema: Tablas y reglas