72

我有一张表,其中有几列构成主键。所存储数据的性质允许其中一些字段具有NULL值。我这样设计了我的桌子:

CREATE TABLE `test` (
    `Field1` SMALLINT(5) UNSIGNED NOT NULL,
    `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`Field1`, `Field2`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;

但是,当我运行describe test它时显示如下:

|| *Field* || *Type*                || *Null* || *Key* || *Default* || *Extra* 
|| Field1  || smallint(5) unsigned  || NO     || PRI   ||           ||         
|| Field2  || decimal(5,2) unsigned || NO     || PRI   || 0.00      ||         

NULL插入值时我不断收到错误消息。

列 'Field2' 不能为空

这是因为作为主键一部分的字段不能为空吗?除了使用'0'之外,我还有什么选择NULL

4

5 回答 5

65

从 MySQL 文档:

首要的关键

必须将所有键列定义为 NOT NULL 的唯一索引。如果它们没有被显式声明为 NOT NULL,MySQL 会隐含地(并且默默地)声明它们。一张表只能有一个 PRIMARY KEY。PRIMARY KEY 的名称始终是 PRIMARY,因此不能用作任何其他类型索引的名称。

https://dev.mysql.com/doc/refman/8.0/en/create-table.html

如果 Field2 可以为 NULL,我质疑为什么您需要将它作为主键的一部分,因为您需要 Field1 在所有行中都是不同的。所以 Field1 本身应该足以作为主键。您可以在 Field2 上创建不同类型的索引。

于 2012-06-12T17:06:35.233 回答
31

主键用于使列既唯一又不为空

为了插入 NULL 值,将 field2 设置为UNIQUE

唯一约束使字段删除重复项但允许

于 2015-05-06T09:40:21.647 回答
8

主键声明该列不能有NULL值。所以用于定义复合主键的列不会是NULL.

Oracle 服务器还比较复合主键定义中使用的所有列的组合。如果您的所有列现有数据(例如 x,y)与新添加的行匹配,则会引发 Unique Constraint Violated 错误。

此外,看看这个线程: 复合主键中可为空的列有什么问题?.

此链接提供了有关复合键中 NULLABLE 列的可能性的有价值信息!

于 2012-06-12T18:28:03.137 回答
7

您可以像这样使用唯一键:

mysql> CREATE TABLE `test` (
    ->     `Field1` SMALLINT(5) UNSIGNED NOT NULL,
    ->     `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
    ->     UNIQUE KEY (`Field1`, `Field2`)
    -> )
    -> COLLATE='latin1_swedish_ci'
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.03 sec)

mysql> 
mysql> desc test
    -> ;
+--------+-----------------------+------+-----+---------+-------+
| Field  | Type                  | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| Field1 | smallint(5) unsigned  | NO   | MUL | NULL    |       |
| Field2 | decimal(5,2) unsigned | YES  |     | NULL    |       |
+--------+-----------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
于 2014-08-20T12:32:14.247 回答
3

您可以使用唯一键,请查看此链接,它们适用于空值

http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/

于 2012-06-12T17:08:16.343 回答