mysql "Default" 列值 NULL 在对 PRIMARY KEY 执行 alter table 时被删除

mysql "Default" column value NULL is getting erased, on executing alter table for PRIMARY KEY

我在 Mysql 数据库中创建了一个全新的 table。 我添加了一个名为 "rks" 的新字段,默认为 NULL,数据类型为 varchar(20).

如果我执行 alter table 来修改这个字段,我可以看到默认列中的 "NULL" 被擦除为空白(如果它是主键),但是如果如果我将它从主键降级,对该变量进行更改,保留状态 "NULL".

请注意:我在使用 alter table 时使用 "default null",如下所示。

mysql> alter table FileTable modify column rks varchar(40) default NULL collate latin1_bin;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

进一步观察:

  1. 如果字段是主键,并且是varchar类型,做alter table 删除 NULL。
  2. 如果字段是 bigint 类型,并且是主要的 key, alter table.
  3. 后 NULL 变为 0

我想知道,为什么会发生这种变化?

Newly created:
+-------------------------+--------------+-------------------+------+-----+---------+
| Field                   | Type         | Collation         | Null | Key | Default |
+-------------------------+--------------+-------------------+------+-----+---------+
| rks                     | varchar(20)  | latin1_bin        | YES  | PRI | NULL    |
+-------------------------+--------------+-------------------+------+-----+---------+

After alter table:
+-------------------------+--------------+-------------------+------+-----+---------+
| Field                   | Type         | Collation         | Null | Key | Default |
+-------------------------+--------------+-------------------+------+-----+---------+
| rks                     | varchar(40)  | latin1_bin        | NO   | PRI |         |
+-------------------------+--------------+-------------------+------+-----+---------+  

看到NULL被擦除,如果字段是整数类型,这将变为0。

我会忽略在具有主键的列中将默认值设置为 NULL。这并不意味着这是它的默认值。当列是主键的一部分时,它不能为 NULL,show tables 中的 "Null" 列决定了行为。

mysql> drop table FileTable;create table FileTable( rks varchar(20) default NULL collate latin1_bin, pk int auto_increment, primary key(pk, rks));
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)

mysql> show columns from FileTable;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| rks   | varchar(20) | NO   | PRI |         |                |
| pk    | int(11)     | NO   | PRI | NULL    | auto_increment |
+-------+-------------+------+-----+---------+----------------+

在上面 table 我添加了一个复合键并显示列在 pk 列中默认为 NULL。这显然是无稽之谈,因为它也是 auto_increment.

我还在这里找到了更多细节

Can a primary key default be NULL? Why is it described as such?