多列主键中的NULL值

我有一个表格,有几列组成主键。 存储的数据的性质允许这些字段中的一些具有NULL值。 我devise了我的桌子,

 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之外,我的替代方法是什么?

从MySQL文档:

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

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

如果Field2可以为NULL,我质疑为什么你需要它作为主键的一部分,因为你需要Field1在所有行中都是不同的。 所以Field1本身就足够了,主键。 您可以在Field2上创build不同types的索引。

主键用于使列既是唯一的也不是空的

为了插入插入空值使field2为唯一

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

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

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

而且,看看这个线程: 复合主键的可空列是怎么回事? 。

此链接提供了有关组合键中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) 

你可以使用唯一的密钥,请看看这个链接,他们使用空值

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