J’ai vu plusieurs fois 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 est la suivante: comme une valeur par défaut est spécifiée, est-il nécessaire de spécifier également que la colonne ne doit pas accepter les valeurs NULL? En d’autres termes, DEFAULT ne rend-il pas redondant NOT NULL?
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 la contrainte NOT NULL
:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"
Ensuite, vous pourriez é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
, conformément à la norme 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. L’ajout de la contrainte NOT NULL
provoquera une erreur avec les instructions 4, 6
, tandis que 1-3, 5
sont toujours des instructions valides. Donc, pour répondre à votre question:
Non, NOT NULL
et DEFAULT
ne sont pas redondants. Notamment, NOT NULL
peut avoir un impact considérable sur les performances des requêtes, comme expliqué dans cet article ici.
Même avec une valeur par défaut, vous pouvez toujours remplacer les données de la colonne par null
.
La ressortingction NOT NULL
ne vous permettra pas de mettre à jour cette ligne après sa création avec une valeur null
Mon professeur SQL a dit que si vous spécifiez à la fois une valeur DEFAULT
et NOT NULL
ou NULL
, DEFAULT
doit 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 pas.
Si la colonne accepte les valeurs NULL, rien ne vous empêche d’insérer une valeur NULL dans le champ, pour autant que je sache, la valeur par défaut ne s’applique que lors de la création d’une nouvelle règle.
Si vous ne définissez pas NULL, vous ne pouvez pas insérer de valeur NULL dans le champ car cela génère une erreur.
Considérez-le comme un mécanisme à sécurité intégrée pour éviter les nuls.