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)
;
=>
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)
;
=>
Un des deux SGBD se serait-il inspiré de l’autre ?
Partager