多列主键中的NULL值

时间:2012-06-12 17:02:05

标签: mysql null composite-primary-key

我有一个包含多个列构成主键的表。存储的数据的性质允许其中一些字段具有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'不能为空

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

5 个答案:

答案 0 :(得分:41)

来自MySQL文档:

  

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

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

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

答案 1 :(得分:22)

  

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

为了插入插入空值,将field2设为唯一

  

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

答案 2 :(得分:7)

主键指出该列不得包含NULL值。因此,用于定义复合主键的列不会是NULL

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

而且,看看这个帖子: What's wrong with nullable columns in composite primary keys?

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

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)