Salta el contingut

BD Treball

Descripció

Tots els exemples d'aquests apunts fan servir la mateixa base de dades de treball: una botiga en línia amb clients, productes, comandes i línies de comanda. Aquesta pàgina conté l'script complet per crear-la i poblar-la amb dades d'exemple, de manera que pugueu reproduir qualsevol consulta o operació dels apunts.

La base de dades té 5 taules amb les relacions següents:

erDiagram
    categories {
        int id_categoria PK
        varchar nom
        text descripcio
    }
    productes {
        int id_producte PK
        int id_categoria FK
        varchar codi_barres
        varchar nom
        numeric preu
        int estoc
        boolean actiu
    }
    clients {
        int id_client PK
        char dni
        varchar nom
        varchar cognoms
        varchar email
        date data_alta
    }
    comandes {
        int id_comanda PK
        int id_client FK
        timestamp data_com
        varchar estat
        numeric total
    }
    linies_comanda {
        int id_comanda FK
        int num_linia
        int id_producte FK
        int quantitat
        numeric preu_unitari
    }

    categories ||--o{ productes : "classifica"
    clients ||--o{ comandes : "realitza"
    comandes ||--|{ linies_comanda : "inclou"
    productes ||--o{ linies_comanda : "forma part"

Dades de la BD

categories (6 files)

id_categoria nom descripcio
1 Electrònica Dispositius electrònics i accessoris
2 Roba Roba i complements de moda
3 Alimentació Productes alimentaris i begudes
4 Llar i jardí Articles per a la llar i el jardí
5 Esport Equipament i roba esportiva
6 Llibres Llibres i material educatiu

productes (12 files)

id cat nom preu estoc actiu
1 1 Portàtil Dell XPS 13 1299.99 15 cert
2 1 Teclat mecànic Logitech 89.99 42 cert
3 1 Auriculars Sony WH-1000XM5 349.99 8 cert
4 2 Samarreta de cotó orgànic 24.99 150 cert
5 2 Pantalons texans slim 49.99 75 cert
6 3 Oli d'oliva verge extra (1L) 8.99 200 cert
7 3 Cafè molido Illy 250g 12.50 85 cert
8 4 Cadira ergonòmica d'oficina 299.99 20 cert
9 4 Llum de taula LED 39.99 0 cert
10 5 Raqueta de pàdel Head 159.99 12 cert
11 5 Zapatilles running Nike 119.99 30 cert
12 6 Clean Code: Robert C. Martin 42.00 0 fals

clients (8 files)

id dni nom cognoms email data_alta
1 12345678A Joan Garcia Puig joan.garcia@example.com 2024-01-15
2 87654321B Maria Lopez Serra maria.lopez@example.com 2024-02-20
3 11111111C Pere Bosch Vila pere.bosch@example.com 2024-03-10
4 22222222D Anna Mas Ribas anna.mas@example.com 2024-04-05
5 33333333E Carles Puig Torres carles.puig@example.com 2024-05-18
6 44444444F Laura Valls Ferrer laura.valls@example.com 2024-06-22
7 55555555G Miquel Soler Costa miquel.soler@example.com 2024-09-03
8 66666666H Núria Roca Palau nuria.roca@example.com 2024-11-14

comandes (10 files)

id client data estat total
1 1 2025-01-10 entregada 1389.98
2 2 2025-01-15 entregada 49.99
3 1 2025-02-05 entregada 349.99
4 3 2025-02-20 enviada 67.96
5 4 2025-03-01 confirmada 299.99
6 2 2025-03-10 pendent 21.49
7 5 2025-03-15 cancel·lada 119.99
8 6 2025-03-20 pendent 279.98
9 7 2025-03-22 confirmada 159.99
10 3 2025-03-25 pendent 89.99

linies_comanda (14 files)

id_comanda num_linia producte quantitat preu_unitari
1 1 1 (Portàtil) 1 1299.99
1 2 2 (Teclat) 1 89.99
2 1 5 (Pantalons) 1 49.99
3 1 3 (Auriculars) 1 349.99
4 1 4 (Samarreta) 2 24.99
4 2 6 (Oli) 2 8.99
5 1 8 (Cadira) 1 299.99
6 1 7 (Cafè) 1 12.50
6 2 6 (Oli) 1 8.99
7 1 11 (Zapatilles) 1 119.99
8 1 10 (Raqueta) 1 159.99
8 2 11 (Zapatilles) 1 119.99
9 1 10 (Raqueta) 1 159.99
10 1 2 (Teclat) 1 89.99

Script de creació

Seleccioneu el vostre motor i executeu l'script complet. Elimina les taules si ja existeixen, les crea de nou i insereix totes les dades d'exemple.

-- ============================================================
-- BD Treball GBD - PostgreSQL
-- Elimina les taules si existeixen i les recrea amb dades
-- ============================================================

DROP TABLE IF EXISTS linies_comanda CASCADE;
DROP TABLE IF EXISTS comandes CASCADE;
DROP TABLE IF EXISTS productes CASCADE;
DROP TABLE IF EXISTS clients CASCADE;
DROP TABLE IF EXISTS categories CASCADE;

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE categories (
    id_categoria SERIAL          PRIMARY KEY,
    nom          VARCHAR(100)    NOT NULL UNIQUE,
    descripcio   TEXT
);

CREATE TABLE productes (
    id_producte  SERIAL          PRIMARY KEY,
    id_categoria INTEGER         NOT NULL,
    codi_barres  VARCHAR(20)     UNIQUE,
    nom          VARCHAR(200)    NOT NULL,
    preu         NUMERIC(10,2)   NOT NULL CHECK (preu > 0),
    estoc        INTEGER         NOT NULL DEFAULT 0 CHECK (estoc >= 0),
    actiu        BOOLEAN         NOT NULL DEFAULT TRUE,
    CONSTRAINT fk_prod_cat FOREIGN KEY (id_categoria)
        REFERENCES categories(id_categoria) ON DELETE RESTRICT
);

CREATE TABLE clients (
    id_client  SERIAL          PRIMARY KEY,
    dni        CHAR(9)         NOT NULL UNIQUE,
    nom        VARCHAR(100)    NOT NULL,
    cognoms    VARCHAR(200)    NOT NULL,
    email      VARCHAR(150)    NOT NULL UNIQUE,
    data_alta  DATE            NOT NULL DEFAULT CURRENT_DATE
);

CREATE TABLE comandes (
    id_comanda SERIAL          PRIMARY KEY,
    id_client  INTEGER         NOT NULL,
    data_com   TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP,
    estat      VARCHAR(20)     NOT NULL DEFAULT 'pendent'
               CHECK (estat IN ('pendent','confirmada','enviada','entregada','cancel·lada')),
    total      NUMERIC(10,2),
    CONSTRAINT fk_com_cli FOREIGN KEY (id_client)
        REFERENCES clients(id_client) ON DELETE RESTRICT
);

CREATE TABLE linies_comanda (
    id_comanda    INTEGER         NOT NULL,
    num_linia     SMALLINT        NOT NULL,
    id_producte   INTEGER         NOT NULL,
    quantitat     INTEGER         NOT NULL CHECK (quantitat > 0),
    preu_unitari  NUMERIC(10,2)   NOT NULL CHECK (preu_unitari > 0),
    CONSTRAINT pk_linies PRIMARY KEY (id_comanda, num_linia),
    CONSTRAINT fk_lin_com FOREIGN KEY (id_comanda)
        REFERENCES comandes(id_comanda) ON DELETE CASCADE,
    CONSTRAINT fk_lin_pro FOREIGN KEY (id_producte)
        REFERENCES productes(id_producte) ON DELETE RESTRICT
);

-- ── CATEGORIES ────────────────────────────────────────────

INSERT INTO categories (id_categoria, nom, descripcio) VALUES
    (1, 'Electrònica',   'Dispositius electrònics i accessoris'),
    (2, 'Roba',          'Roba i complements de moda'),
    (3, 'Alimentació',   'Productes alimentaris i begudes'),
    (4, 'Llar i jardí',  'Articles per a la llar i el jardí'),
    (5, 'Esport',        'Equipament i roba esportiva'),
    (6, 'Llibres',       'Llibres i material educatiu');

SELECT setval('categories_id_categoria_seq', 6);

-- ── PRODUCTES ─────────────────────────────────────────────

INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) VALUES
    (1,  1, 'Portàtil Dell XPS 13',          1299.99, 15,  TRUE),
    (2,  1, 'Teclat mecànic Logitech',          89.99, 42,  TRUE),
    (3,  1, 'Auriculars Sony WH-1000XM5',      349.99,  8,  TRUE),
    (4,  2, 'Samarreta de cotó orgànic',         24.99, 150, TRUE),
    (5,  2, 'Pantalons texans slim',              49.99, 75,  TRUE),
    (6,  3, 'Oli d''oliva verge extra (1L)',       8.99, 200, TRUE),
    (7,  3, 'Cafè molido Illy 250g',             12.50, 85,  TRUE),
    (8,  4, 'Cadira ergonòmica d''oficina',      299.99, 20,  TRUE),
    (9,  4, 'Llum de taula LED',                 39.99,  0,  TRUE),
    (10, 5, 'Raqueta de pàdel Head',            159.99, 12,  TRUE),
    (11, 5, 'Zapatilles running Nike',           119.99, 30,  TRUE),
    (12, 6, 'Clean Code: Robert C. Martin',       42.00,  0,  FALSE);

SELECT setval('productes_id_producte_seq', 12);

-- ── CLIENTS ───────────────────────────────────────────────

INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-15'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-20'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-10'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-05'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-18'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-06-22'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-03'),
    (8, '66666666H', 'Núria',  'Roca Palau',   'nuria.roca@example.com',   '2024-11-14');

SELECT setval('clients_id_client_seq', 8);

-- ── COMANDES ──────────────────────────────────────────────

INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) VALUES
    (1,  1, '2025-01-10 10:30:00', 'entregada',   1389.98),
    (2,  2, '2025-01-15 16:45:00', 'entregada',     49.99),
    (3,  1, '2025-02-05 09:15:00', 'entregada',    349.99),
    (4,  3, '2025-02-20 11:00:00', 'enviada',       67.96),
    (5,  4, '2025-03-01 14:20:00', 'confirmada',   299.99),
    (6,  2, '2025-03-10 17:05:00', 'pendent',       21.49),
    (7,  5, '2025-03-15 10:00:00', 'cancel·lada',  119.99),
    (8,  6, '2025-03-20 12:30:00', 'pendent',      279.98),
    (9,  7, '2025-03-22 15:00:00', 'confirmada',   159.99),
    (10, 3, '2025-03-25 09:45:00', 'pendent',       89.99);

SELECT setval('comandes_id_comanda_seq', 10);

-- ── LINIES DE COMANDA ─────────────────────────────────────

INSERT INTO linies_comanda (id_comanda, num_linia, id_producte, quantitat, preu_unitari) VALUES
    (1,  1,  1, 1, 1299.99),
    (1,  2,  2, 1,   89.99),
    (2,  1,  5, 1,   49.99),
    (3,  1,  3, 1,  349.99),
    (4,  1,  4, 2,   24.99),
    (4,  2,  6, 2,    8.99),
    (5,  1,  8, 1,  299.99),
    (6,  1,  7, 1,   12.50),
    (6,  2,  6, 1,    8.99),
    (7,  1, 11, 1,  119.99),
    (8,  1, 10, 1,  159.99),
    (8,  2, 11, 1,  119.99),
    (9,  1, 10, 1,  159.99),
    (10, 1,  2, 1,   89.99);
-- ============================================================
-- BD Treball GBD - MySQL / MariaDB
-- ============================================================

DROP DATABASE IF EXISTS gbd_treball;
CREATE DATABASE gbd_treball
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
USE gbd_treball;

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE categories (
    id_categoria INT             AUTO_INCREMENT PRIMARY KEY,
    nom          VARCHAR(100)    NOT NULL UNIQUE,
    descripcio   TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE productes (
    id_producte  INT             AUTO_INCREMENT PRIMARY KEY,
    id_categoria INT             NOT NULL,
    codi_barres  VARCHAR(20)     UNIQUE,
    nom          VARCHAR(200)    NOT NULL,
    preu         DECIMAL(10,2)   NOT NULL CHECK (preu > 0),
    estoc        INT             NOT NULL DEFAULT 0 CHECK (estoc >= 0),
    actiu        TINYINT(1)      NOT NULL DEFAULT 1,
    CONSTRAINT fk_prod_cat FOREIGN KEY (id_categoria)
        REFERENCES categories(id_categoria) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE clients (
    id_client  INT             AUTO_INCREMENT PRIMARY KEY,
    dni        CHAR(9)         NOT NULL UNIQUE,
    nom        VARCHAR(100)    NOT NULL,
    cognoms    VARCHAR(200)    NOT NULL,
    email      VARCHAR(150)    NOT NULL UNIQUE,
    data_alta  DATE            NOT NULL DEFAULT (CURRENT_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE comandes (
    id_comanda INT             AUTO_INCREMENT PRIMARY KEY,
    id_client  INT             NOT NULL,
    data_com   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    estat      VARCHAR(20)     NOT NULL DEFAULT 'pendent',
    CONSTRAINT chk_estat CHECK (estat IN ('pendent','confirmada','enviada','entregada','cancel·lada')),
    total      DECIMAL(10,2),
    CONSTRAINT fk_com_cli FOREIGN KEY (id_client)
        REFERENCES clients(id_client) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE linies_comanda (
    id_comanda    INT             NOT NULL,
    num_linia     SMALLINT        NOT NULL,
    id_producte   INT             NOT NULL,
    quantitat     INT             NOT NULL CHECK (quantitat > 0),
    preu_unitari  DECIMAL(10,2)   NOT NULL CHECK (preu_unitari > 0),
    CONSTRAINT pk_linies PRIMARY KEY (id_comanda, num_linia),
    CONSTRAINT fk_lin_com FOREIGN KEY (id_comanda)
        REFERENCES comandes(id_comanda) ON DELETE CASCADE,
    CONSTRAINT fk_lin_pro FOREIGN KEY (id_producte)
        REFERENCES productes(id_producte) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── CATEGORIES ────────────────────────────────────────────

INSERT INTO categories (id_categoria, nom, descripcio) VALUES
    (1, 'Electrònica',   'Dispositius electrònics i accessoris'),
    (2, 'Roba',          'Roba i complements de moda'),
    (3, 'Alimentació',   'Productes alimentaris i begudes'),
    (4, 'Llar i jardí',  'Articles per a la llar i el jardí'),
    (5, 'Esport',        'Equipament i roba esportiva'),
    (6, 'Llibres',       'Llibres i material educatiu');

-- ── PRODUCTES ─────────────────────────────────────────────

INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) VALUES
    (1,  1, 'Portàtil Dell XPS 13',          1299.99, 15,  1),
    (2,  1, 'Teclat mecànic Logitech',          89.99, 42,  1),
    (3,  1, 'Auriculars Sony WH-1000XM5',      349.99,  8,  1),
    (4,  2, 'Samarreta de cotó orgànic',         24.99, 150, 1),
    (5,  2, 'Pantalons texans slim',              49.99, 75,  1),
    (6,  3, 'Oli d''oliva verge extra (1L)',       8.99, 200, 1),
    (7,  3, 'Cafè molido Illy 250g',             12.50, 85,  1),
    (8,  4, 'Cadira ergonòmica d''oficina',      299.99, 20,  1),
    (9,  4, 'Llum de taula LED',                 39.99,  0,  1),
    (10, 5, 'Raqueta de pàdel Head',            159.99, 12,  1),
    (11, 5, 'Zapatilles running Nike',           119.99, 30,  1),
    (12, 6, 'Clean Code: Robert C. Martin',       42.00,  0,  0);

-- ── CLIENTS ───────────────────────────────────────────────

INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-15'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-20'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-10'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-05'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-18'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-06-22'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-03'),
    (8, '66666666H', 'Núria',  'Roca Palau',   'nuria.roca@example.com',   '2024-11-14');

-- ── COMANDES ──────────────────────────────────────────────

INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) VALUES
    (1,  1, '2025-01-10 10:30:00', 'entregada',   1389.98),
    (2,  2, '2025-01-15 16:45:00', 'entregada',     49.99),
    (3,  1, '2025-02-05 09:15:00', 'entregada',    349.99),
    (4,  3, '2025-02-20 11:00:00', 'enviada',       67.96),
    (5,  4, '2025-03-01 14:20:00', 'confirmada',   299.99),
    (6,  2, '2025-03-10 17:05:00', 'pendent',       21.49),
    (7,  5, '2025-03-15 10:00:00', 'cancel·lada',  119.99),
    (8,  6, '2025-03-20 12:30:00', 'pendent',      279.98),
    (9,  7, '2025-03-22 15:00:00', 'confirmada',   159.99),
    (10, 3, '2025-03-25 09:45:00', 'pendent',       89.99);

-- ── LINIES DE COMANDA ─────────────────────────────────────

INSERT INTO linies_comanda (id_comanda, num_linia, id_producte, quantitat, preu_unitari) VALUES
    (1,  1,  1, 1, 1299.99),
    (1,  2,  2, 1,   89.99),
    (2,  1,  5, 1,   49.99),
    (3,  1,  3, 1,  349.99),
    (4,  1,  4, 2,   24.99),
    (4,  2,  6, 2,    8.99),
    (5,  1,  8, 1,  299.99),
    (6,  1,  7, 1,   12.50),
    (6,  2,  6, 1,    8.99),
    (7,  1, 11, 1,  119.99),
    (8,  1, 10, 1,  159.99),
    (8,  2, 11, 1,  119.99),
    (9,  1, 10, 1,  159.99),
    (10, 1,  2, 1,   89.99);
-- ============================================================
-- BD Treball GBD - SQL Server
-- ============================================================

IF EXISTS (SELECT name FROM sys.databases WHERE name = 'gbd_treball')
    DROP DATABASE gbd_treball;
GO
CREATE DATABASE gbd_treball;
GO
USE gbd_treball;
GO

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE categories (
    id_categoria INT             IDENTITY(1,1) PRIMARY KEY,
    nom          NVARCHAR(100)   NOT NULL UNIQUE,
    descripcio   NVARCHAR(MAX)
);

CREATE TABLE productes (
    id_producte  INT             IDENTITY(1,1) PRIMARY KEY,
    id_categoria INT             NOT NULL,
    codi_barres  NVARCHAR(20)    UNIQUE,
    nom          NVARCHAR(200)   NOT NULL,
    preu         DECIMAL(10,2)   NOT NULL CONSTRAINT chk_preu CHECK (preu > 0),
    estoc        INT             NOT NULL DEFAULT 0 CONSTRAINT chk_estoc CHECK (estoc >= 0),
    actiu        BIT             NOT NULL DEFAULT 1,
    CONSTRAINT fk_prod_cat FOREIGN KEY (id_categoria)
        REFERENCES categories(id_categoria) ON DELETE NO ACTION
);

CREATE TABLE clients (
    id_client  INT             IDENTITY(1,1) PRIMARY KEY,
    dni        CHAR(9)         NOT NULL UNIQUE,
    nom        NVARCHAR(100)   NOT NULL,
    cognoms    NVARCHAR(200)   NOT NULL,
    email      NVARCHAR(150)   NOT NULL UNIQUE,
    data_alta  DATE            NOT NULL DEFAULT GETDATE()
);

CREATE TABLE comandes (
    id_comanda INT             IDENTITY(1,1) PRIMARY KEY,
    id_client  INT             NOT NULL,
    data_com   DATETIME2       NOT NULL DEFAULT GETDATE(),
    estat      NVARCHAR(20)    NOT NULL DEFAULT 'pendent'
               CONSTRAINT chk_estat CHECK (estat IN ('pendent','confirmada','enviada','entregada','cancel·lada')),
    total      DECIMAL(10,2),
    CONSTRAINT fk_com_cli FOREIGN KEY (id_client)
        REFERENCES clients(id_client) ON DELETE NO ACTION
);

CREATE TABLE linies_comanda (
    id_comanda    INT             NOT NULL,
    num_linia     SMALLINT        NOT NULL,
    id_producte   INT             NOT NULL,
    quantitat     INT             NOT NULL CONSTRAINT chk_qtt CHECK (quantitat > 0),
    preu_unitari  DECIMAL(10,2)   NOT NULL CONSTRAINT chk_preu_u CHECK (preu_unitari > 0),
    CONSTRAINT pk_linies PRIMARY KEY (id_comanda, num_linia),
    CONSTRAINT fk_lin_com FOREIGN KEY (id_comanda)
        REFERENCES comandes(id_comanda) ON DELETE CASCADE,
    CONSTRAINT fk_lin_pro FOREIGN KEY (id_producte)
        REFERENCES productes(id_producte) ON DELETE NO ACTION
);
GO

-- ── CATEGORIES ────────────────────────────────────────────

SET IDENTITY_INSERT categories ON;
INSERT INTO categories (id_categoria, nom, descripcio) VALUES
    (1, 'Electrònica',   'Dispositius electrònics i accessoris'),
    (2, 'Roba',          'Roba i complements de moda'),
    (3, 'Alimentació',   'Productes alimentaris i begudes'),
    (4, 'Llar i jardí',  'Articles per a la llar i el jardí'),
    (5, 'Esport',        'Equipament i roba esportiva'),
    (6, 'Llibres',       'Llibres i material educatiu');
SET IDENTITY_INSERT categories OFF;
GO

-- ── PRODUCTES ─────────────────────────────────────────────

SET IDENTITY_INSERT productes ON;
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) VALUES
    (1,  1, 'Portàtil Dell XPS 13',          1299.99, 15,  1),
    (2,  1, 'Teclat mecànic Logitech',          89.99, 42,  1),
    (3,  1, 'Auriculars Sony WH-1000XM5',      349.99,  8,  1),
    (4,  2, 'Samarreta de cotó orgànic',         24.99, 150, 1),
    (5,  2, 'Pantalons texans slim',              49.99, 75,  1),
    (6,  3, 'Oli d''oliva verge extra (1L)',       8.99, 200, 1),
    (7,  3, 'Cafè molido Illy 250g',             12.50, 85,  1),
    (8,  4, 'Cadira ergonòmica d''oficina',      299.99, 20,  1),
    (9,  4, 'Llum de taula LED',                 39.99,  0,  1),
    (10, 5, 'Raqueta de pàdel Head',            159.99, 12,  1),
    (11, 5, 'Zapatilles running Nike',           119.99, 30,  1),
    (12, 6, 'Clean Code: Robert C. Martin',       42.00,  0,  0);
SET IDENTITY_INSERT productes OFF;
GO

-- ── CLIENTS ───────────────────────────────────────────────

SET IDENTITY_INSERT clients ON;
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-15'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-20'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-10'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-05'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-18'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-06-22'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-03'),
    (8, '66666666H', 'Núria',  'Roca Palau',   'nuria.roca@example.com',   '2024-11-14');
SET IDENTITY_INSERT clients OFF;
GO

-- ── COMANDES ──────────────────────────────────────────────

SET IDENTITY_INSERT comandes ON;
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) VALUES
    (1,  1, '2025-01-10 10:30:00', 'entregada',   1389.98),
    (2,  2, '2025-01-15 16:45:00', 'entregada',     49.99),
    (3,  1, '2025-02-05 09:15:00', 'entregada',    349.99),
    (4,  3, '2025-02-20 11:00:00', 'enviada',       67.96),
    (5,  4, '2025-03-01 14:20:00', 'confirmada',   299.99),
    (6,  2, '2025-03-10 17:05:00', 'pendent',       21.49),
    (7,  5, '2025-03-15 10:00:00', 'cancel·lada',  119.99),
    (8,  6, '2025-03-20 12:30:00', 'pendent',      279.98),
    (9,  7, '2025-03-22 15:00:00', 'confirmada',   159.99),
    (10, 3, '2025-03-25 09:45:00', 'pendent',       89.99);
SET IDENTITY_INSERT comandes OFF;
GO

-- ── LINIES DE COMANDA ─────────────────────────────────────

INSERT INTO linies_comanda (id_comanda, num_linia, id_producte, quantitat, preu_unitari) VALUES
    (1,  1,  1, 1, 1299.99),
    (1,  2,  2, 1,   89.99),
    (2,  1,  5, 1,   49.99),
    (3,  1,  3, 1,  349.99),
    (4,  1,  4, 2,   24.99),
    (4,  2,  6, 2,    8.99),
    (5,  1,  8, 1,  299.99),
    (6,  1,  7, 1,   12.50),
    (6,  2,  6, 1,    8.99),
    (7,  1, 11, 1,  119.99),
    (8,  1, 10, 1,  159.99),
    (8,  2, 11, 1,  119.99),
    (9,  1, 10, 1,  159.99),
    (10, 1,  2, 1,   89.99);
GO
-- ============================================================
-- BD Treball GBD - Oracle (connectat a XEPDB1 o la PDB de treball)
-- ============================================================

-- Elimina les taules si existeixen (ignora l'error si no existeixen)
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE linies_comanda CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL;
END;
/
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE comandes CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL;
END;
/
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE productes CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL;
END;
/
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE clients CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL;
END;
/
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE categories CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL;
END;
/

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE categories (
    id_categoria NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom          VARCHAR2(100)   NOT NULL UNIQUE,
    descripcio   VARCHAR2(4000)
);

CREATE TABLE productes (
    id_producte  NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    id_categoria NUMBER          NOT NULL,
    codi_barres  VARCHAR2(20)    UNIQUE,
    nom          VARCHAR2(200)   NOT NULL,
    preu         NUMBER(10,2)    NOT NULL CHECK (preu > 0),
    estoc        NUMBER          DEFAULT 0 NOT NULL CHECK (estoc >= 0),
    actiu        NUMBER(1)       DEFAULT 1 NOT NULL CHECK (actiu IN (0,1)),
    CONSTRAINT fk_prod_cat FOREIGN KEY (id_categoria)
        REFERENCES categories(id_categoria) ON DELETE NO ACTION
);

CREATE TABLE clients (
    id_client  NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    dni        CHAR(9)         NOT NULL UNIQUE,
    nom        VARCHAR2(100)   NOT NULL,
    cognoms    VARCHAR2(200)   NOT NULL,
    email      VARCHAR2(150)   NOT NULL UNIQUE,
    data_alta  DATE            DEFAULT SYSDATE NOT NULL
);

CREATE TABLE comandes (
    id_comanda NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    id_client  NUMBER          NOT NULL,
    data_com   TIMESTAMP       DEFAULT CURRENT_TIMESTAMP NOT NULL,
    estat      VARCHAR2(20)    DEFAULT 'pendent' NOT NULL
               CHECK (estat IN ('pendent','confirmada','enviada','entregada','cancel·lada')),
    total      NUMBER(10,2),
    CONSTRAINT fk_com_cli FOREIGN KEY (id_client)
        REFERENCES clients(id_client) ON DELETE NO ACTION
);

CREATE TABLE linies_comanda (
    id_comanda    NUMBER      NOT NULL,
    num_linia     NUMBER(5)   NOT NULL,
    id_producte   NUMBER      NOT NULL,
    quantitat     NUMBER      NOT NULL CHECK (quantitat > 0),
    preu_unitari  NUMBER(10,2) NOT NULL CHECK (preu_unitari > 0),
    CONSTRAINT pk_linies PRIMARY KEY (id_comanda, num_linia),
    CONSTRAINT fk_lin_com FOREIGN KEY (id_comanda)
        REFERENCES comandes(id_comanda) ON DELETE CASCADE,
    CONSTRAINT fk_lin_pro FOREIGN KEY (id_producte)
        REFERENCES productes(id_producte) ON DELETE NO ACTION
);

-- ── CATEGORIES ────────────────────────────────────────────
-- OVERRIDING SYSTEM VALUE permet inserir IDs explícits amb GENERATED ALWAYS

INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (1, 'Electrònica',   'Dispositius electrònics i accessoris');
INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (2, 'Roba',          'Roba i complements de moda');
INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (3, 'Alimentació',   'Productes alimentaris i begudes');
INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (4, 'Llar i jardí',  'Articles per a la llar i el jardí');
INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (5, 'Esport',        'Equipament i roba esportiva');
INSERT INTO categories (id_categoria, nom, descripcio) OVERRIDING SYSTEM VALUE VALUES
    (6, 'Llibres',       'Llibres i material educatiu');

-- ── PRODUCTES ─────────────────────────────────────────────

INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (1,  1, 'Portàtil Dell XPS 13',          1299.99, 15,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (2,  1, 'Teclat mecànic Logitech',          89.99, 42,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (3,  1, 'Auriculars Sony WH-1000XM5',      349.99,  8,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (4,  2, 'Samarreta de cotó orgànic',         24.99, 150, 1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (5,  2, 'Pantalons texans slim',              49.99, 75,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (6,  3, 'Oli d''oliva verge extra (1L)',       8.99, 200, 1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (7,  3, 'Cafè molido Illy 250g',             12.50, 85,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (8,  4, 'Cadira ergonòmica d''oficina',      299.99, 20,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (9,  4, 'Llum de taula LED',                 39.99,  0,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (10, 5, 'Raqueta de pàdel Head',            159.99, 12,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (11, 5, 'Zapatilles running Nike',           119.99, 30,  1);
INSERT INTO productes (id_producte, id_categoria, nom, preu, estoc, actiu) OVERRIDING SYSTEM VALUE VALUES (12, 6, 'Clean Code: Robert C. Martin',       42.00,  0,  0);

-- ── CLIENTS ───────────────────────────────────────────────

INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  DATE '2024-01-15');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  DATE '2024-02-20');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   DATE '2024-03-10');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     DATE '2024-04-05');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  DATE '2024-05-18');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  DATE '2024-06-22');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', DATE '2024-09-03');
INSERT INTO clients (id_client, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (8, '66666666H', 'Núria',  'Roca Palau',   'nuria.roca@example.com',   DATE '2024-11-14');

-- ── COMANDES ──────────────────────────────────────────────

INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (1,  1, TIMESTAMP '2025-01-10 10:30:00', 'entregada',   1389.98);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (2,  2, TIMESTAMP '2025-01-15 16:45:00', 'entregada',     49.99);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (3,  1, TIMESTAMP '2025-02-05 09:15:00', 'entregada',    349.99);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (4,  3, TIMESTAMP '2025-02-20 11:00:00', 'enviada',       67.96);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (5,  4, TIMESTAMP '2025-03-01 14:20:00', 'confirmada',   299.99);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (6,  2, TIMESTAMP '2025-03-10 17:05:00', 'pendent',       21.49);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (7,  5, TIMESTAMP '2025-03-15 10:00:00', 'cancel·lada',  119.99);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (8,  6, TIMESTAMP '2025-03-20 12:30:00', 'pendent',      279.98);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (9,  7, TIMESTAMP '2025-03-22 15:00:00', 'confirmada',   159.99);
INSERT INTO comandes (id_comanda, id_client, data_com, estat, total) OVERRIDING SYSTEM VALUE VALUES (10, 3, TIMESTAMP '2025-03-25 09:45:00', 'pendent',       89.99);

-- ── LINIES DE COMANDA ─────────────────────────────────────

INSERT INTO linies_comanda VALUES (1,  1,  1, 1, 1299.99);
INSERT INTO linies_comanda VALUES (1,  2,  2, 1,   89.99);
INSERT INTO linies_comanda VALUES (2,  1,  5, 1,   49.99);
INSERT INTO linies_comanda VALUES (3,  1,  3, 1,  349.99);
INSERT INTO linies_comanda VALUES (4,  1,  4, 2,   24.99);
INSERT INTO linies_comanda VALUES (4,  2,  6, 2,    8.99);
INSERT INTO linies_comanda VALUES (5,  1,  8, 1,  299.99);
INSERT INTO linies_comanda VALUES (6,  1,  7, 1,   12.50);
INSERT INTO linies_comanda VALUES (6,  2,  6, 1,    8.99);
INSERT INTO linies_comanda VALUES (7,  1, 11, 1,  119.99);
INSERT INTO linies_comanda VALUES (8,  1, 10, 1,  159.99);
INSERT INTO linies_comanda VALUES (8,  2, 11, 1,  119.99);
INSERT INTO linies_comanda VALUES (9,  1, 10, 1,  159.99);
INSERT INTO linies_comanda VALUES (10, 1,  2, 1,   89.99);

COMMIT;

Verificació ràpida

Un cop executat l'script, podeu verificar que tot ha anat bé amb:

SELECT 'categories'    AS taula, COUNT(*) AS files FROM categories    UNION ALL
SELECT 'productes',              COUNT(*)           FROM productes     UNION ALL
SELECT 'clients',                COUNT(*)           FROM clients       UNION ALL
SELECT 'comandes',               COUNT(*)           FROM comandes      UNION ALL
SELECT 'linies_comanda',         COUNT(*)           FROM linies_comanda;
Heu d'obtenir: 6 · 12 · 8 · 10 · 14 files respectivament.

Reinici de la BD

Si heu modificat les dades fent proves i voleu tornar a l'estat original, torneu a executar l'script complet des del principi. L'script elimina i recrea totes les taules, de manera que es perden totes les dades existents.