|
| 1 | +CREATE TABLE IF NOT EXISTS customers ( |
| 2 | + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 3 | + email VARCHAR(255) NOT NULL UNIQUE, |
| 4 | + full_name VARCHAR(255) NOT NULL, |
| 5 | + country_code CHAR(2) NOT NULL, |
| 6 | + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| 7 | +); |
| 8 | + |
| 9 | +CREATE TABLE IF NOT EXISTS products ( |
| 10 | + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 11 | + sku VARCHAR(64) NOT NULL UNIQUE, |
| 12 | + name VARCHAR(255) NOT NULL, |
| 13 | + category VARCHAR(120) NOT NULL, |
| 14 | + price NUMERIC(10, 2) NOT NULL, |
| 15 | + stock INTEGER NOT NULL DEFAULT 0 |
| 16 | +); |
| 17 | + |
| 18 | +CREATE TABLE IF NOT EXISTS orders ( |
| 19 | + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 20 | + customer_id INTEGER NOT NULL REFERENCES customers(id) ON DELETE CASCADE, |
| 21 | + order_number VARCHAR(40) NOT NULL UNIQUE, |
| 22 | + status VARCHAR(32) NOT NULL DEFAULT 'pending', |
| 23 | + ordered_at TIMESTAMP NOT NULL, |
| 24 | + CONSTRAINT chk_orders_status |
| 25 | + CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')) |
| 26 | +); |
| 27 | + |
| 28 | +CREATE TABLE IF NOT EXISTS order_items ( |
| 29 | + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 30 | + order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE, |
| 31 | + product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE RESTRICT, |
| 32 | + quantity INTEGER NOT NULL, |
| 33 | + unit_price NUMERIC(10, 2) NOT NULL, |
| 34 | + UNIQUE (order_id, product_id) |
| 35 | +); |
| 36 | + |
| 37 | +INSERT INTO customers (id, email, full_name, country_code, created_at) VALUES |
| 38 | + (1, 'ava@example.com', 'Ava Johnson', 'US', '2026-01-04 09:15:00'), |
| 39 | + (2, 'liam@example.com', 'Liam Carter', 'DE', '2026-01-08 13:42:00'), |
| 40 | + (3, 'mia@example.com', 'Mia Chen', 'GB', '2026-01-12 17:05:00') |
| 41 | +ON CONFLICT (id) DO UPDATE SET |
| 42 | + email = EXCLUDED.email, |
| 43 | + full_name = EXCLUDED.full_name, |
| 44 | + country_code = EXCLUDED.country_code, |
| 45 | + created_at = EXCLUDED.created_at; |
| 46 | + |
| 47 | +INSERT INTO products (id, sku, name, category, price, stock) VALUES |
| 48 | + (1, 'LAP-14-PRO', 'StarQuery Laptop Pro 14', 'hardware', 1499.00, 12), |
| 49 | + (2, 'MON-27-IPS', 'Nebula Monitor 27', 'hardware', 329.90, 24), |
| 50 | + (3, 'DOCK-USB-C', 'Orbit USB-C Dock', 'accessories', 119.50, 50), |
| 51 | + (4, 'MOU-WL-ERG', 'Comet Ergonomic Mouse', 'accessories', 59.99, 80) |
| 52 | +ON CONFLICT (id) DO UPDATE SET |
| 53 | + sku = EXCLUDED.sku, |
| 54 | + name = EXCLUDED.name, |
| 55 | + category = EXCLUDED.category, |
| 56 | + price = EXCLUDED.price, |
| 57 | + stock = EXCLUDED.stock; |
| 58 | + |
| 59 | +INSERT INTO orders (id, customer_id, order_number, status, ordered_at) VALUES |
| 60 | + (1, 1, 'SQ-1001', 'paid', '2026-02-02 10:30:00'), |
| 61 | + (2, 2, 'SQ-1002', 'shipped', '2026-02-05 15:10:00'), |
| 62 | + (3, 1, 'SQ-1003', 'pending', '2026-02-17 08:00:00') |
| 63 | +ON CONFLICT (id) DO UPDATE SET |
| 64 | + customer_id = EXCLUDED.customer_id, |
| 65 | + order_number = EXCLUDED.order_number, |
| 66 | + status = EXCLUDED.status, |
| 67 | + ordered_at = EXCLUDED.ordered_at; |
| 68 | + |
| 69 | +INSERT INTO order_items (id, order_id, product_id, quantity, unit_price) VALUES |
| 70 | + (1, 1, 1, 1, 1499.00), |
| 71 | + (2, 1, 3, 1, 119.50), |
| 72 | + (3, 2, 2, 2, 329.90), |
| 73 | + (4, 2, 4, 1, 59.99), |
| 74 | + (5, 3, 3, 3, 119.50) |
| 75 | +ON CONFLICT (id) DO UPDATE SET |
| 76 | + order_id = EXCLUDED.order_id, |
| 77 | + product_id = EXCLUDED.product_id, |
| 78 | + quantity = EXCLUDED.quantity, |
| 79 | + unit_price = EXCLUDED.unit_price; |
| 80 | + |
| 81 | +SELECT setval('customers_id_seq', GREATEST((SELECT MAX(id) FROM customers), 1), true); |
| 82 | +SELECT setval('products_id_seq', GREATEST((SELECT MAX(id) FROM products), 1), true); |
| 83 | +SELECT setval('orders_id_seq', GREATEST((SELECT MAX(id) FROM orders), 1), true); |
| 84 | +SELECT setval('order_items_id_seq', GREATEST((SELECT MAX(id) FROM order_items), 1), true); |
0 commit comments