在多列主键NULL值(NULL value in multi-column primary key)

2019-06-25 10:11发布

我有一个表有几列组成的主键。 存储的数据的性质允许一些这些领域有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值。

列“字段2”不能为空

这是否是因为一个字段是主键的一部分,不能为空? 什么是除了使用我的替代品,说,“0”为NULL

Answer 1:

从MySQL文档:

主键是所有键列必须被定义为NOT NULL唯一索引。 如果他们
没有明确声明为NOT NULL,MySQL的声明他们这么含蓄(默默)。 一个表只能有一个主键。 一主键的名称始终PRIMARY,其因此不能被用作名称任何其他种类的索引。

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

如果字段2可以为NULL,我问,为什么你需要它作为主键的一部分,因为你这时就需要字段1能够跨所有行不同。 所以字段1本身应足以作为主键。 您可以创建在字段2不同类型的索引。



Answer 2:

主键是用来使列既独特又不是null

序插入插入空值使场2作为唯一

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



Answer 3:

主键指出,列不能有NULL值。 所以,用于定义复合主键列不会是NULL

也Oracle服务器在一个复合主键定义中使用的所有的列的组合进行比较。 如果你的所有列现有的数据(比如X,Y)与新加入的行匹配,它将提高违反的唯一约束的错误。

此外,看看这个线程: 这有什么错在复合主键空列? 。

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



Answer 4:

您可以使用的唯一密钥,请看一看这个环节,他们用空值工作

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



Answer 5:

您可以使用这样独特的钥匙:

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 value in multi-column primary key