Toujours avec PostgreSQL V10, si VAL est l’objet d’une clé alternative, alors le résultat n’est pas plus brillant :
CREATE TABLE T_SET
(
ID SERIAL
, VAL INT NOT NULL
, CONSTRAINT T_SET_PK PRIMARY KEY (ID)
, CONSTRAINT T_SET_AK UNIQUE (VAL)
);
INSERT INTO T_SET (VAL) VALUES
(-8), (-7), (-6), (-5), (-4), (-3), (-2), (-1), (0)
, (1), (2), (3), (4), (5), (6), (7), (8)
;
UPDATE T_SET
SET VAL = POWER(VAL, 3)
;
=>
« ERROR: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « t_set_ak »
DETAIL: La clé « (val)=(8) » existe déjà. »
Si VAL n’est l’objet d’aucune clé, alors le résultat est correct :
CREATE TABLE T_SET
(
ID SERIAL
, VAL INT NOT NULL
, CONSTRAINT T_SET_PK PRIMARY KEY (ID)
);
INSERT INTO T_SET (VAL) VALUES
(-8), (-7), (-6), (-5), (-4), (-3), (-2), (-1), (0)
, (1), (2), (3), (4), (5), (6), (7), (8)
;
UPDATE T_SET
SET VAL = POWER(VAL, 3)
;
=>
![Nom : codd_regle7_pgg(val_is_not_key).png
Affichages : 342
Taille : 16,7 Ko](https://www.developpez.net/forums/attachments/p525033d1576591906/bases-donnees/decisions-sgbd/regle-numero-7-codd/codd_regle7_pgg-val_is_not_key-.png/)
Au tour de MySQL (v 5.7) : si VAL est clé primaire, MySQL se comporte comme PostgreSQL :
CREATE TABLE T_SET
(
VAL INT NOT NULL
, CONSTRAINT T_SET_PK PRIMARY KEY (VAL)
);
INSERT INTO T_SET (VAL) VALUES
(-8), (-7), (-6), (-5), (-4), (-3), (-2), (-1), (0)
, (1), (2), (3), (4), (5), (6), (7), (8)
;
UPDATE T_SET
SET VAL = POWER(VAL, 3)
;
=>
« Error Code: 1062. Duplicate entry '8' for key 'PRIMARY' »
Si avec MySQL, VAL fait l’objet d’une clé alternative, une fois encore ça n’est pas brillant :
CREATE TABLE T_SET
(
ID INT NOT NULL AUTO_INCREMENT
, VAL INT NOT NULL
, CONSTRAINT T_SET_PK PRIMARY KEY (ID)
, CONSTRAINT T_SET_AK UNIQUE (VAL)
);
INSERT INTO T_SET (VAL) VALUES
(-8), (-7), (-6), (-5), (-4), (-3), (-2), (-1), (0)
, (1), (2), (3), (4), (5), (6), (7), (8)
;
UPDATE T_SET
SET VAL = POWER(VAL, 3)
;
=>
« Error Code: 1062. Duplicate entry '8' for key 'T_SET_AK' »
Mais comme PostgreSQL, MySQL a au moins la décence de bien se comporter quand VAL ne fait l’objet d’aucune clé :
CREATE TABLE T_SET
(
ID INT NOT NULL AUTO_INCREMENT
, VAL INT NOT NULL
, CONSTRAINT T_SET_PK PRIMARY KEY (ID)
);
INSERT INTO T_SET (VAL) VALUES
(-8), (-7), (-6), (-5), (-4), (-3), (-2), (-1), (0)
, (1), (2), (3), (4), (5), (6), (7), (8)
;
UPDATE T_SET
SET VAL = POWER(VAL, 3)
;
=>
![Nom : champomy62_codd_regle7_mysql(val_is_not_key).png
Affichages : 317
Taille : 15,8 Ko](https://www.developpez.net/forums/attachments/p525047d1576593513/bases-donnees/decisions-sgbd/regle-numero-7-codd/champomy62_codd_regle7_mysql-val_is_not_key-.png/)
Un des deux SGBD se serait-il inspiré de l’autre ? ![:D](https://www.developpez.net/forums/images/smilies/icon_biggrin.gif)
Partager