web-dev-qa-db-fra.com

Définition de la colonne SQL: valeur par défaut et non null redondante?

J'ai souvent vu la syntaxe suivante qui définit une colonne dans une instruction create/alter DDL:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

La question qui se pose est la suivante: étant donné qu’une valeur par défaut est spécifiée, faut-il également spécifier que la colonne ne doit pas accepter les valeurs NULL? En d'autres termes, DEFAULT ne rend-il pas NOT NULL redondant?

66
Razvan

DEFAULT est la valeur qui sera insérée en l'absence d'une valeur explicite dans une instruction insert/update. Supposons que votre DDL n’ait pas le NOT NULL contrainte:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"

Ensuite, vous pouvez émettre ces déclarations

-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Vous pouvez également utiliser DEFAULT dans les instructions UPDATE, selon le standard SQL-1992 :

-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Notez que toutes les bases de données ne prennent pas en charge toutes ces syntaxes standard SQL. Ajout du NOT NULL _ contrainte provoquera une erreur avec les instructions 4, 6, tandis que 1-3, 5 sont toujours des déclarations valides. Donc, pour répondre à votre question: non, ils ne sont pas redondants.

94
Lukas Eder

Même avec une valeur par défaut, vous pouvez toujours remplacer les données de colonne avec null.

La restriction NOT NULL Ne vous permettra pas de mettre à jour cette ligne après sa création avec la valeur null

15
Tamir

Mon professeur SQL a dit que si vous spécifiez une valeur DEFAULT et NOT NULL Ou NULL, DEFAULT devrait toujours être exprimé avant NOT NULL Ou NULL.

Comme ça:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL

2

Je dirais non.

Si la colonne accepte les valeurs null, rien ne vous empêche alors d'insérer une valeur null dans le champ. Autant que je sache, la valeur par défaut ne s'applique que lors de la création d'une nouvelle règle.

Si la valeur not null est définie, vous ne pouvez pas insérer de valeur NULL dans le champ car une erreur sera générée.

Considérez-le comme un mécanisme à sécurité intégrée permettant d'éviter les valeurs nulles.

0
Dark Hippo