6
votes

Alter Tableau ne me laissant pas mettre de valeur nul ou par défaut?

J'essaie de modifier une colonne existante dans un tableau, je dois autoriser les valeurs null, puis définir la valeur par défaut sur NULL. J'ai essayé de courir ce qui suit mais il ne semble pas mettre à jour la table:

mysql> ALTER TABLE answers_form MODIFY sub_id int unsigned NULL DEFAULT NULL;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc answers_form;
+--------------+------------------+------+-----+---------+-------+
| Field        | Type             | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+-------+
| answer_id    | int(10) unsigned | NO   | PRI | 0       |       |
| sub_id       | int(10) unsigned | NO   | PRI | 0       |       |
| form_id      | int(10) unsigned | NO   | PRI | NULL    |       |
| value        | varchar(255)     | NO   |     | NULL    |       |
| non_response | bit(1)           | YES  |     | b'0'    |       |
+--------------+------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)


1 commentaires

Est-il possible que vous ne puissiez pas définir cette colonne pour être nullable car elle fait partie de la clé primaire?


3 Réponses :


5
votes

C'est une clé primaire, MySQL n'autorise aucune partie de la clé primaire d'être null, ce qui permet de faire une valeur par défaut de NULL pour le formulaire impair, mais les docs à

http://dev.mysql.com/ DOC / REFMAN / 5.5 / FR / OPTIMISATION-KEYS DE PRIMAIRE.HTML

dire " performance de la requête bénéficie de l'optimisation non nulle, car elle ne peut pas inclure de valeurs nulles ".

juste hors de curiosité, vous permet-il de mettre en valeur des valeurs nulles dans le champ form_id?


4 commentaires

Vous pouvez simplement faire un peu Fiddle et découvrez-le pour vous-même.


Je lui ai donné un coup et non, je ne pouvais pas insérer une nulle. Je suppose que mon meilleur pari est de simplement utiliser une clé unique au lieu d'une clé primaire dans ce cas?


OK, au moins, le comportement est cohérent avec la documentation, éventuellement la production de la descente est trompeuse. Et oui, une clé unique, peut-être même plus savoureuse, introduisez deux nouvelles tables à rejoindre :) Par exemple, Sub_assoc (réponse_id, sub_id) et form_assoc (réponse_id, sub_id). Ensuite, vous pouvez faire deux jointures gauche sur ces tables et avoir des nuls retournés si rien n'existe (sans peupler la base de données avec des nulls ennuyeux :) Je n'ai pas Null OCD lol)


J'ai ajouté un champ par erreur à ma clé principale et cela ne m'a pas laissé le changer pour accepter Null. La silentrie de la requête Alter quitte le champ pour ne pas null au lieu de lancer une erreur "Vous ne pouvez pas avoir une partie nullable de la clé primaire".



1
votes

Vous avez 2 colonnes non nullables avec la valeur par défaut de NULL. Cela ne devrait pas être autorisé par votre moteur de base de données. Si c'est le cas, c'est plutôt loin d'être une meilleure pratique.


1 commentaires

@Be, j'ai ajouté des informations supplémentaires à ma réponse à propos de la colonne non nullable avec "NULL" par défaut.



1
votes

Sub_ID est répertorié comme une clé primaire

du MySQL Docs (5.7, mais d'autres versions disent la même chose):

Une clé principale est un index unique dans lequel toutes les colonnes de clé doivent être définies. Comme non nulle. S'ils ne sont pas explicitement déclarés comme non NULL, MYSQL les déclare si implicitement (et silencieusement).

sur la discussion sur les colonnes non nulles ayant une valeur par défaut de null ...

the null La colonne par défaut signifie qu'il n'y a pas de valeur par défaut, non que la valeur par défaut est null .

violon: http://sqlfiddle.com/#!2/c718d/1

Si je crée une table simple comme Donc: xxx

et ensuite faire desc nom_num , je reçois: xxx

encore, Du MySQL Docs :

Si la colonne ne peut pas prendre NULL comme valeur, MySQL définit la colonne sans clause par défaut explicite. Exception: si la colonne est définie comme faisant partie d'une clé primaire, mais pas explicitement comme non NULL, MySQL la crée comme une colonne NON NULL (car les colonnes de clé principale ne doivent pas être nuls), mais l'attribue également une clause par défaut à l'aide de la défaillance implicite. valeur. Pour éviter cela, incluez un explicite non nulle dans la définition de la colonne clé principale.


1 commentaires

form_id n'est pas nullable (null non) mais il a une valeur par défaut de NULL.