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 :

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( ) ;
Ce script me donne le résultat suivant :

Avant 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 |
+----------------------+----------+--------+-----+------+
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 |      1 |   4 |    2 |
| Boulogne-Billancourt | Paris    |      8 |   5 |    1 |
| Nanterre             | Paris    |      8 |   5 |    1 |
+----------------------+----------+--------+-----+------+
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    |      6 |   4 |    2 |
| Nanterre             | Paris    |      6 |   4 |    2 |
+----------------------+----------+--------+-----+------+
Je dois passer à côté de qquechose, mais quoi ? Une idée ? Merci