好的,让我改一下。这就是我的表格所描述的。
mysql> describe department;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| dnumber | int(1) | NO | PRI | NULL | |
| dname | varchar(15) | YES | | NULL | |
| mgrssn | varchar(9) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
这就是我需要将我的表描述为:
+--------------+-------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+--------------+-------------+------+-----+---------+
| dnumber | int(1) | NO | PRI | NOT NULL|
| dname | varchar(15) | YES | | NULL |
| mgrssn | varchar(9) | YES | | NULL |
+--------------+-------------+------+-----+---------+
如何更改dnumber的默认值以使其不为null?
答案 0 :(得分:1)
由于dnumber
是department
表的主键,因此不能具有空值。
那么,如果您真的尝试插入以下内容会发生什么?
INSERT INTO department(dname, mgrssn) VALUES ("test", "123456789");
您希望插入失败并显示错误。但不,它成功了,(尽管有警告):
mysql> INSERT INTO department(dname, mgrssn) VALUES ("test", "123456789");
Query OK, 1 row affected, 1 warning (0.04 sec)
刚刚发生了什么?好吧,原来是MySQL的many gotchas之一,其中“ NULL是非空的”。今天的MySQL手册says pretty much the same thing:
如果列定义不包含显式DEFAULT值,MySQL将根据Section 11.5, “Data Type Default Values”中的描述确定默认值。
那么,实际插入了什么?我们来看看:
mysql> select * from department;
+---------+-------+-----------+
| dnumber | dname | mgrssn |
+---------+-------+-----------+
| 0 | test | 123456789 |
+---------+-------+-----------+
1 row in set (0.00 sec)
这里发生的事情是,MySQL采用了隐含式尝试将NULL
插入dnumber
的插入语句,并将其静静地转换为INT
的默认值,或者0。
还有一个really good video更详细地描述了MySQL和其他奇怪的事情(与PostgreSQL相比)。
最后,让我再添加一条建议 - 由于它是主键,因此将dnumber
设置为自动递增列是一种非常好的做法,如下所示:
mysql> ALTER TABLE department MODIFY dnumber int(1) AUTO_INCREMENT;
Query OK, 1 row affected (0.27 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> desc department;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| dnumber | int(1) | NO | PRI | NULL | auto_increment |
| dname | varchar(15) | YES | | NULL | |
| mgrssn | varchar(9) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
这样,将来插入department
并不会总是尝试为dnumber
插入另一个0来导致重复键错误,而是使用下一个最低可用整数值,例如1,然后是2,然后是3,等等。
希望这有帮助!