更改默认值

时间:2012-11-30 02:27:43

标签: mysql

好的,让我改一下。这就是我的表格所描述的。

    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?

1 个答案:

答案 0 :(得分:1)

由于dnumberdepartment表的主键,因此不能具有空值。

那么,如果您真的尝试插入以下内容会发生什么?

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,等等。

希望这有帮助!