1

好的,让我改写一下。这就是我的桌子的描述。

    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 的默认值以使其不为空?

4

1 回答 1

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 的许多陷阱之一,其中“ NULL is NOT NULL ”。今天的 MySQL 手册说的几乎一样

如果列定义不包含显式 DEFAULT 值,MySQL 将按照第 11.5 节“数据类型默认值”</a> 中所述确定默认值。

那么,到底插入了什么?让我们来看看:

mysql> select * from department;
+---------+-------+-----------+
| dnumber | dname | mgrssn    |
+---------+-------+-----------+
|       0 | test  | 123456789 |
+---------+-------+-----------+
1 row in set (0.00 sec)

这里发生的事情是,MySQL 采用了隐式尝试插入的插入语句,NULLdnumber悄悄地将其转换为默认值INT或 0。

还有一个非常好的视频,更详细地描述了 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不会总是尝试插入另一个 0 来dnumber导致重复键错误,而是会使用下一个最低的可用整数值,例如 1,然后是 2,然后是 3,等等。

希望这可以帮助!

于 2012-11-30T03:27:52.857 回答