Bonjour,
Comme je ne suis plus sur de rien, je récapitule ce que j'ai compris du pb :
Créer 1 cde avec 1 n° auto
Créer les lignes de cette cde
2 contraintes :
il faut renseigner le N° de cde ds las lignes.
il ne faut pas mélanger les lignes de plusieurs cdes.
J'ai essayé ça ce matin :
Création schéma
Insertion d'1 cde et de ces lignes :
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
40
41
42 DROP SEQUENCE seqprod; DROP SEQUENCE seqcmde; CREATE SEQUENCE seqprod; CREATE SEQUENCE seqcmde; DROP TABLE r_prod_cmd; DROP TABLE t_commande; DROP TABLE t_produit; CREATE TABLE t_produit ( prod_Id INTEGER NOT NULL DEFAULT NEXTVAL ('seqprod'), prod_Libelle VARCHAR(32) NOT NULL, PRIMARY KEY (prod_Id) ) TABLESPACE "DVP"; CREATE TABLE t_commande ( cmd_Id INTEGER NOT NULL DEFAULT NEXTVAL ('seqcmde'), cmd_Date TIMESTAMP NOT NULL, PRIMARY KEY (cmd_Id) ) TABLESPACE "DVP"; CREATE TABLE r_prod_cmd ( cmd_Id INTEGER NOT NULL, prod_Id INTEGER NOT NULL, qte INTEGER NOT NULL, PRIMARY KEY (cmd_Id, prod_Id), FOREIGN KEY (cmd_Id) REFERENCES t_commande (cmd_Id), FOREIGN KEY (prod_Id) REFERENCES t_produit (prod_Id) ) TABLESPACE "DVP"; INSERT INTO t_produit (prod_Libelle) ( SELECT 'Produit 1' UNION ALL SELECT 'Produit 2' UNION ALL SELECT 'Produit 3' UNION ALL SELECT 'Produit 4' );
J'ai volontairement omis le COMMIT, et j'ai lancé plusieurs autres insertions dans des fenêtres SQL différentes. Elles sont ttes restées bloquées par le 'LOCK' tant que je n'ai pas committé la première par COMMIT WORK;
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 BEGIN TRANSACTION; INSERT INTO t_commande (cmd_Date) ( SELECT current_date ); INSERT INTO r_prod_cmd (cmd_Id, prod_Id, qte) ( SELECT MAX(cmd_Id), 1, 10 FROM t_commande ); INSERT INTO r_prod_cmd (cmd_Id, prod_Id, qte) ( SELECT MAX(cmd_Id), 3, 30 FROM t_commande );
C'est ce que je voulais obtenir :
-La création d'une cde avec 1 id autoincrementé
-les lignes de cdes contiennent bien l'id de la cde.
-tant que cette cde la n'est pas validée, on ne peut pas en insérer 1 autre, donc pas de risque de mélange.
@Gaël Donat: Est-ce que j'ai 1 risque en faisant comme ça ? J'ai tjours cru que c'était bon, mais comme ça ne semble pas aussi simple, merci de me corriger.
NB : J'ai fait la même chose avec SQL Server avec le même résultat.
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 USE DVP; DROP TABLE r_prod_cmd; DROP TABLE t_commande; DROP TABLE t_produit; CREATE TABLE t_produit ( prod_Id INTEGER NOT NULL IDENTITY (1,1), prod_Libelle VARCHAR(32) NOT NULL, PRIMARY KEY (prod_Id) ); CREATE TABLE t_commande ( cmd_Id INTEGER NOT NULL IDENTITY (1,1), cmd_Date DATETIME NOT NULL, PRIMARY KEY (cmd_Id) ); CREATE TABLE r_prod_cmd ( cmd_Id INTEGER NOT NULL, prod_Id INTEGER NOT NULL, qte INTEGER NOT NULL, PRIMARY KEY (cmd_Id, prod_Id), FOREIGN KEY (cmd_Id) REFERENCES t_commande (cmd_Id), FOREIGN KEY (prod_Id) REFERENCES t_produit (prod_Id) ); INSERT INTO t_produit (prod_Libelle) ( SELECT 'Produit 1' UNION ALL SELECT 'Produit 2' UNION ALL SELECT 'Produit 3' ); --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; INSERT INTO t_commande (cmd_Date) ( SELECT getdate() ); INSERT INTO r_prod_cmd (cmd_Id, prod_Id, qte) ( SELECT MAX(cmd_Id), 1, 10 FROM t_commande ); INSERT INTO r_prod_cmd (cmd_Id, prod_Id, qte) ( SELECT MAX(cmd_Id), 3, 30 FROM t_commande ); COMMIT WORK; --SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Partager