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?
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.
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
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
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.