schema_setup.sql en SQL
Una migración completa: eliminar, crear, indexar y sembrar el esquema de una tienda pequeña.
-- Esquema de la tienda, seguro de reejecutar desde cero.
PRAGMA foreign_keys = ON;
DROP VIEW IF EXISTS order_summary;
DROP TABLE IF EXISTS order_items;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
country TEXT NOT NULL DEFAULT 'US',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE products (
sku TEXT PRIMARY KEY,
name TEXT NOT NULL,
price REAL NOT NULL CHECK (price >= 0)
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
status TEXT NOT NULL DEFAULT 'pending',
total REAL NOT NULL DEFAULT 0,
placed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
sku TEXT NOT NULL REFERENCES products(sku),
quantity INTEGER NOT NULL CHECK (quantity > 0),
UNIQUE (order_id, sku)
);
CREATE INDEX IF NOT EXISTS idx_orders_customer
ON orders (customer_id, placed_at DESC);
CREATE VIEW order_summary AS
SELECT
o.id,
c.name AS customer,
o.status,
o.total,
COUNT(i.sku) AS lines
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id
LEFT JOIN order_items AS i
ON i.order_id = o.id
GROUP BY o.id, c.name, o.status, o.total;
INSERT INTO customers (name, email, country)
VALUES
('Ada Lovelace', 'ada@example.com', 'GB'),
('Grace Hopper', 'grace@example.com', 'US');
INSERT INTO products (sku, name, price)
VALUES
('TS-001', 'Keyboard', 89.00),
('TS-002', 'Keycap set', 45.50);
Cómo funciona
- Las sentencias corren en orden de dependencia: padres antes que hijos.
IF EXISTSeIF NOT EXISTShacen todo el archivo re-ejecutable.- Una vista al final le da a la aplicación un solo nombre amable que consultar.
Palabras clave y builtins usados aquí
ASBYCASCADECHECKCOUNTCREATECURRENT_TIMESTAMPDEFAULTDELETEDESCDROPEXISTSFROMGROUPIFINDEXINSERTINTEGERINTOJOINKEYLEFTNOTNULLONPRIMARYREALREFERENCESSELECTTABLETEXTTIMESTAMPUNIQUEVALUESVIEWc
El intento, en números
- Líneas
- 64
- Caracteres a escribir
- 1588
- Tokens
- 336
- Ritmo de tres estrellas
- 85 tpm
Al ritmo de tres estrellas de 85 tokens por minuto, este intento toma unos 237 segundos.
Paso 1 de 2 en Bis; paso 22 de 23 en Fundamentos del lenguaje.