Hello à tous !
J'ai une requête UPDATE qui ne se comporte pas comme espéré.
Description :
- J'ai deux tables : stocks et ateliers.
- Un atelier est rattaché à un stock, un stock peut avoir plusieurs ateliers.
- Un stock dispose de farine, d'eau et de pain.
- A chaque appel du UPDATE le stock doit être incrémenté de 1 pain pour 2 farine et 1 eau dispos par atelier qui lui est rattaché.
Voici mon script de test :
Ce script me donne le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 DROP SCHEMA IF EXISTS boulangeries ; CREATE SCHEMA boulangeries ; USE boulangeries ; CREATE TABLE stocks ( stock_localisation VARCHAR(30), stock_farine INT, stock_eau INT, stock_pain INT, CONSTRAINT PRIMARY KEY(stock_localisation) ) ; INSERT INTO stocks VALUES('Paris', 10, 6, 0), ('Bordeaux', 3, 5, 1) ; CREATE TABLE ateliers ( atelier_localisation VARCHAR(30), atelier_stock VARCHAR(30), CONSTRAINT PRIMARY KEY(atelier_localisation), CONSTRAINT FOREIGN KEY(atelier_stock) REFERENCES stocks(stock_localisation) ) ; INSERT INTO ateliers VALUES('Boulogne-Billancourt', 'Paris'), ('Gradignan', 'Bordeaux'), ('Nanterre', 'Paris') ; -- Affiche les ressources des ateliers CREATE PROCEDURE ATELIERS( ) SELECT ALL atelier_localisation AS atelier, stock_localisation AS stock, stock_farine AS farine, stock_eau AS eau, stock_pain AS pain FROM ateliers INNER JOIN stocks ON atelier_stock = stock_localisation ; CREATE PROCEDURE PRODUIRE( ) UPDATE stocks INNER JOIN ateliers ON stock_localisation = atelier_stock SET stock_farine = stock_farine - 2, stock_eau = stock_eau - 1, stock_pain = stock_pain + 1 WHERE stock_farine >= 2 AND stock_eau >= 1 ; CALL ATELIERS( ) ; CALL PRODUIRE( ) ; CALL ATELIERS( ) ;
Avant le UPDATE :
Après le UPDATE :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +----------------------+----------+--------+-----+------+ | atelier | stock | farine | eau | pain | +----------------------+----------+--------+-----+------+ | Gradignan | Bordeaux | 3 | 5 | 1 | | Boulogne-Billancourt | Paris | 10 | 6 | 0 | | Nanterre | Paris | 10 | 6 | 0 | +----------------------+----------+--------+-----+------+
Alors que je m'attendais plutôt à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +----------------------+----------+--------+-----+------+ | atelier | stock | farine | eau | pain | +----------------------+----------+--------+-----+------+ | Gradignan | Bordeaux | 1 | 4 | 2 | | Boulogne-Billancourt | Paris | 8 | 5 | 1 | | Nanterre | Paris | 8 | 5 | 1 | +----------------------+----------+--------+-----+------+
Je dois passer à côté de qquechose, mais quoi ? Une idée ? Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +----------------------+----------+--------+-----+------+ | atelier | stock | farine | eau | pain | +----------------------+----------+--------+-----+------+ | Gradignan | Bordeaux | 1 | 4 | 2 | | Boulogne-Billancourt | Paris | 6 | 4 | 2 | | Nanterre | Paris | 6 | 4 | 2 | +----------------------+----------+--------+-----+------+![]()
Partager