2016-03-11 35 views
0

我在Mysql数据库中创建了一个新的新表。 我添加了一个新字段,名为“rks”,默认为空,数据类型为varchar(20)。mysql“默认”列值NULL在执行PRIMARY KEY的alter table时正在被擦除

如果我执行alter table,修改这个字段,我可以看到默认列中的“NULL”被删除为空(万一它是主键),但是如果万一我降级它从主键,对这个变量进行修改,保留状态“NULL”。

请注意:我使用“default null”,而使用alter table如下。

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类型,操作的方式改变 表中删除NULL。
  2. 如果字段类型为bigint,并且主键为 ,则在alter table之后将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

回答

1

我忽略默认被设置为NULL与主键的列。这并不意味着这是它默认的价值。当列是主键的一部分时,它不能为NULL,表格表中的“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 | 
+-------+-------------+------+-----+---------+----------------+ 

在上表中,我添加了一个组合键,并且显示列在pk列中的默认值为NULL。这显然是无稽之谈,因为它也是auto_increment。

我还发现这里一些细节

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

+0

感谢您的回答 – kingsmasher1