web-dev-qa-db-fra.com

Colonnes MySQL avec DEFAULT NULL - choix stylistique, ou est-ce?

Dans de nombreuses versions de SQL, il existe trois façons de définir implicitement une colonne sur NULL à chaque insertion de ligne. Ceux-ci sont:

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

C'est à dire. le premier définit le drapeau NULL (par opposition à NOT NULL), le second laisse le drapeau NULL à la valeur par défaut, et le troisième définit le drapeau NULL et définit la valeur implicite comme NULL.

J'ai entendu dire que dans Microsoft SQL, la deuxième variante n'est pas exactement la même puisque vous pouvez également personnaliser la valeur par défaut de l'indicateur NULL pour les tables ou les schémas.

Mais pour MySQL, je ne pense pas qu'il existe une telle fonctionnalité. De plus, dans MySQL, les colonnes avec l'indicateur NULL, contrairement aux colonnes NOT NULL, sont toujours implicitement définies sur NULL lors de l'insertion s'il n'y a pas de valeur explicite, même si le mode strict est activé. Cela laisse donc toutes ces déclarations de colonne identiques.

Dans mon script MySQL, pour chaque colonne NOT NULL, je spécifie une valeur DEFAULT pour les colonnes que je ne m'attends pas à définir dans certaines insertions dans mon application, pour éviter tout problème si je devais activer le mode strict. Ainsi, je pense que ce serait plus symétrique si je choisissais la troisième variation, même si elle est la plus verbeuse et explicite. Les déclarations comme la troisième variante sont-elles courantes, ou la première ou la deuxième variante se produit-elle plus fréquemment dans les scripts des autres?

J'envisageais de m'appuyer sur la deuxième approche parce que c'est l'alias que le vidage MySQL utilise, mais je ne suis pas sûr que ce soit une bonne idée car il vide également les littéraux entiers sous forme de chaînes (guillemets simples) dans les clauses par défaut des déclarations de colonnes.

Cette question peut sembler être plus d'opinion que celle qui a une solution, mais je veux également être au courant de tout problème potentiel que je ne connais pas. Je peux choisir de migrer de MySQL vers PostgreSQL à l'avenir, et je pourrais également utiliser les conseils de ces experts, par exemple si PostgreSQL distingue ces cas comme le fait MS-SQL. Corrigez-moi si je me trompe si j'ai fait des hypothèses incorrectes.

20
Kevin Jin

Chaque base de données que j'ai rencontrée traite les valeurs NULL comme vous les décrivez. Lorsqu'une colonne accepte des valeurs NULL, le fait de ne pas fournir de valeur dans INSERT définit la valeur par défaut sur NULL. Je crois que cela fait partie du comportement standard ANSI.

Quant à spécifier "NULL" lui-même. C'est une question de préférence. La norme dit qu'une colonne autorise les NULL sauf si NOT NULL est spécifié (au niveau du langage de définition des données). Ainsi, le NULL lui-même n'est pas nécessaire, et vous avez une quatrième option équivalente:

columnname type

Les valeurs NULL sont assez intégrées dans le langage SQL via la norme ANSI. Votre troisième option est la plus explicite, mais elle semble également un peu inhabituelle.

Si vous prévoyez d'être super-cohérent dans tout votre système, alors je prendrais le chemin que vous suivez. Pour chaque colonne de chaque table, NULL ou NOT NULL. Pour toutes les colonnes qui prennent des valeurs par défaut, disposez de l'instruction DEFAULT.

Cependant, ne vous attendez pas à ce que d'autres personnes avec lesquelles vous travaillez (maintenant ou à l'avenir) suivent facilement cet exemple. Beaucoup préféreraient la quatrième option dans ce cas simplement parce qu'elle nécessite moins de frappe et est la façon dont tous (ou presque) les dialectes SQL se comportent.

11
Gordon Linoff

Comme indiqué sous Valeurs par défaut du type de données :

Si la colonne peut prendre NULL comme valeur, la colonne est définie avec une clause explicite DEFAULT NULL.

(Je pense qu'ils signifiaient implicite , et non explicite ).

De plus, comme indiqué sous CREATE TABLE Syntaxe :

Si ni NULL ni NOT NULL N'est spécifié, la colonne est traitée comme si NULL avait été spécifiée.

Par conséquent, dans MySQL, les définitions de colonnes suivantes sont toutes identiques:

columnname type
columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

Le choix de l'utilisation est un équilibre entre être explicite et concis. Selon les circonstances, je pourrais utiliser l'un des éléments ci-dessus.

21
eggyal