我有一个表有几列组成的主键。 存储的数据的性质允许一些这些领域有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
?
从MySQL文档:
主键是所有键列必须被定义为NOT NULL唯一索引。 如果他们
没有明确声明为NOT NULL,MySQL的声明他们这么含蓄(默默)。 一个表只能有一个主键。 一主键的名称始终PRIMARY,其因此不能被用作名称任何其他种类的索引。
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
如果字段2可以为NULL,我问,为什么你需要它作为主键的一部分,因为你这时就需要字段1能够跨所有行不同。 所以字段1本身应足以作为主键。 您可以创建在字段2不同类型的索引。
主键指出,列不能有NULL
值。 所以,用于定义复合主键列不会是NULL
。
也Oracle服务器在一个复合主键定义中使用的所有的列的组合进行比较。 如果你的所有列现有的数据(比如X,Y)与新加入的行匹配,它将提高违反的唯一约束的错误。
此外,看看这个线程: 这有什么错在复合主键空列? 。
此链接提供关于复合键空列的可能性有价值的信息!
您可以使用的唯一密钥,请看一看这个环节,他们用空值工作
http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/
您可以使用这样独特的钥匙:
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)