多列主键中的 NULL 值

我得到了一个包含几个列的表,它们构成了主键。存储的数据的性质允许其中一些字段具有 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      ||

And I keep getting an error when inserting a NULL value.

列“ Field2”不能为空

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

88549 次浏览

From the MySQL documentation :

主钥匙

一个唯一的索引,其中所有键列必须定义为 NOTNULL 它们没有被显式声明为 NOT NULL,MySQL 将它们声明为 NOT NULL 一个表只能有一个 PRIMARYKEY name of a PRIMARY KEY is always PRIMARY, which thus cannot be used as 任何其他类型索引的名称。

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

如果 Field2可以是 NULL,那么我想知道为什么需要它作为主键的一部分,因为您需要 Field1在所有行之间是不同的。因此 Field1本身应该足以作为主键。您可以在 Field2上创建不同类型的索引。

你可以使用唯一的键,请看一下这个链接,它们的工作原理是空值

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

主键指定列不能有 NULL值。因此用于定义复合主键的列不会是 NULL

Oracle 服务器还比较组合主键定义中使用的所有列的组合。如果现有的所有列数据(例如 x,y)与新添加的行匹配,则会引发“唯一约束违反”错误。

Moreover,look at this thread: 复合主键中的可空列有什么问题?

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

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

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)

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

为了插入 NULL 值,将 field2作为 独一无二

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