-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrestaurant.sql
More file actions
183 lines (160 loc) · 5.69 KB
/
restaurant.sql
File metadata and controls
183 lines (160 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/* ============================================================
restaurant.sql – création + données de test
============================================================ */
PRAGMA foreign_keys = ON;
/* ---------- 1. TABLES PRINCIPALES -------------------------- */
CREATE TABLE CLIENT (
id_client INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
prenom TEXT,
email TEXT UNIQUE,
tel TEXT
);
CREATE TABLE RESTAURANT (
id_restaurant INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
adresse TEXT,
ville TEXT
);
CREATE TABLE EMPLOYE (
id_employe INTEGER PRIMARY KEY,
id_restaurant INTEGER NOT NULL,
nom TEXT NOT NULL,
prenom TEXT,
poste TEXT,
date_embauche DATE,
FOREIGN KEY (id_restaurant) REFERENCES RESTAURANT(id_restaurant)
);
CREATE TABLE ARTICLE (
id_article INTEGER PRIMARY KEY,
libelle TEXT NOT NULL,
prix_unitaire REAL NOT NULL
);
CREATE TABLE MENU (
id_menu INTEGER PRIMARY KEY,
id_restaurant INTEGER NOT NULL,
nom TEXT NOT NULL,
prix_base REAL, -- mis à jour par trigger
FOREIGN KEY (id_restaurant) REFERENCES RESTAURANT(id_restaurant)
);
CREATE TABLE COMMANDE (
id_commande INTEGER PRIMARY KEY,
id_client INTEGER NOT NULL,
date_commande DATETIME DEFAULT CURRENT_TIMESTAMP,
statut TEXT,
FOREIGN KEY (id_client) REFERENCES CLIENT(id_client)
);
/* ---------- 2. TABLES D’ASSOCIATION ------------------------ */
CREATE TABLE COMMANDE_MENU (
id_commande INTEGER,
id_menu INTEGER,
PRIMARY KEY (id_commande, id_menu),
FOREIGN KEY (id_commande) REFERENCES COMMANDE(id_commande) ON DELETE CASCADE,
FOREIGN KEY (id_menu) REFERENCES MENU(id_menu) ON DELETE CASCADE
);
CREATE TABLE MENU_ARTICLE (
id_menu INTEGER,
id_article INTEGER,
quantite INTEGER NOT NULL CHECK (quantite >= 1),
PRIMARY KEY (id_menu, id_article),
FOREIGN KEY (id_menu) REFERENCES MENU(id_menu) ON DELETE CASCADE,
FOREIGN KEY (id_article) REFERENCES ARTICLE(id_article)
);
/* ---------- 3. TRIGGERS : PRIX DU MENU --------------------- */
DROP TRIGGER IF EXISTS maj_prix_menu_insert;
DROP TRIGGER IF EXISTS maj_prix_menu_update;
DROP TRIGGER IF EXISTS maj_prix_menu_delete;
/* Recalcule après INSERT */
CREATE TRIGGER maj_prix_menu_insert
AFTER INSERT ON MENU_ARTICLE
BEGIN
UPDATE MENU
SET prix_base = COALESCE((
SELECT SUM(a.prix_unitaire * ma.quantite)
FROM MENU_ARTICLE ma
JOIN ARTICLE a USING(id_article)
WHERE ma.id_menu = NEW.id_menu
), 0)
WHERE id_menu = NEW.id_menu;
END;
/* Recalcule après UPDATE */
CREATE TRIGGER maj_prix_menu_update
AFTER UPDATE ON MENU_ARTICLE
BEGIN
-- Nouveau menu potentiellement impacté
UPDATE MENU
SET prix_base = COALESCE((
SELECT SUM(a.prix_unitaire * ma.quantite)
FROM MENU_ARTICLE ma
JOIN ARTICLE a USING(id_article)
WHERE ma.id_menu = NEW.id_menu
), 0)
WHERE id_menu = NEW.id_menu;
-- Ancien menu (si id_menu change)
UPDATE MENU
SET prix_base = COALESCE((
SELECT SUM(a.prix_unitaire * ma.quantite)
FROM MENU_ARTICLE ma
JOIN ARTICLE a USING(id_article)
WHERE ma.id_menu = OLD.id_menu
), 0)
WHERE id_menu = OLD.id_menu;
END;
/* Recalcule après DELETE */
CREATE TRIGGER maj_prix_menu_delete
AFTER DELETE ON MENU_ARTICLE
BEGIN
UPDATE MENU
SET prix_base = COALESCE((
SELECT SUM(a.prix_unitaire * ma.quantite)
FROM MENU_ARTICLE ma
JOIN ARTICLE a USING(id_article)
WHERE ma.id_menu = OLD.id_menu
), 0)
WHERE id_menu = OLD.id_menu;
END;
/* ---------- 4. DONNÉES DE TEST ----------------------------- */
/* Restaurants */
INSERT INTO RESTAURANT (id_restaurant, nom, adresse, ville) VALUES
(1,'Le Bistrot','12 rue du Marché','Lyon'),
(2,'Veggie Spot','8 quai Vert','Lyon'),
(3,'Chez Elena','5 place Pailleron','Grenoble');
/* Articles */
INSERT INTO ARTICLE (id_article, libelle, prix_unitaire) VALUES
(1,'Burger',12.5),
(2,'Frites',4),
(3,'Salade',5.5),
(4,'Café',2);
/* Menus (prix_base sera calculé) */
INSERT INTO MENU (id_menu,id_restaurant,nom) VALUES
(1,1,'Menu Midi'),
(2,2,'Menu Végétarien');
/* Composition des menus */
INSERT INTO MENU_ARTICLE VALUES
(1,1,1), -- Menu 1 : 1 Burger
(1,2,2), -- 2 Frites
(1,4,1), -- 1 Café
(2,3,2), -- Menu 2 : 2 Salades
(2,4,1); -- 1 Café
/* Clients */
INSERT INTO CLIENT (id_client,nom,prenom,email,tel) VALUES
(1,'Dupont','Jean','jean.dupont@gmail.com','0601010101'),
(2,'Martin','Clara','clara.martin@yahoo.fr','0602020202'),
(3,'Durand','Hugo','hugo@outlook.com','0603030303'),
(4,'Nguyen','Linh','linh@gmail.com','0604040404'),
(5,'Rossi','Paolo','paolo@gmail.com','0605050505');
/* Employés */
INSERT INTO EMPLOYE (id_employe,id_restaurant,nom,prenom,poste,date_embauche) VALUES
(1,1,'Bernard','Alice','Serveuse','2023-04-01'),
(2,1,'Fabre','Luc','Cuisinier','2022-10-15'),
(3,2,'Morel','Inès','Caissière','2024-01-10'),
(4,3,'Petit','Omar','Livreur','2023-06-20');
/* Commandes */
INSERT INTO COMMANDE (id_commande,id_client,statut) VALUES
(1,1,'en cours'),
(2,3,'preparée');
/* Lignes de commandes */
INSERT INTO COMMANDE_MENU VALUES
(1,1), -- commande 1 = menu 1
(2,2); -- commande 2 = menu 2
/* ---------- FIN DU SCRIPT ---------------------------------- */