Définition de la colonne SQL: valeur par défaut et non nul redondant?

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.