【发布时间】:2012-06-12 17:02:04
【问题描述】:
我有一个表,其中有几列构成主键。所存储数据的性质允许其中一些字段具有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”之外,我还有什么其他选择?
【问题讨论】:
-
感谢 vj shah 的链接,@Tomalak 使 excellent point 表明此限制遵循基本 SQL 原则,即由于 PRIMARY 键的部分必须从每一行与每一行进行比较,并且“ NULL 不能是比较的一部分 - 这种比较的结果将始终为 NULL”,强制 PRIMARY 键唯一性需要非空列。
-
对于字符串,对其中一列使用空字符串(或设为默认值),这样可以毫无问题地插入一条记录。后续插入需要有一些值来确保复合键(多列主键)的唯一性。
标签: mysql null composite-primary-key