mysql 主键 null_mysql-多列主键中的NULL值

mysql-多列主键中的NULL值

我有一个包含几列组成主键的表。 存储的数据的性质允许这些字段中的某些字段具有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;

但是,当我运行NULL时,它显示如下:

|| *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个解决方案

47 votes

从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上创建其他类型的索引。

Girish Rao answered 2019-11-17T02:23:44Z

24 votes

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

为了插入插入空值,使字段为唯一

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

Lordferrous answered 2019-11-17T02:24:21Z

7 votes

主键指出该列不能具有NULL值。 因此,用于定义组合主键的列将不会是NULL。

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

此外,请查看此线程:复合主键中的可为空的列怎么了?

该链接提供了有关复合键中NULLABLE列的可能性的有价值的信息!

vijay answered 2019-11-17T02:25:08Z

3 votes

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

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

jcho360 answered 2019-11-17T02:25:41Z

3 votes

您可以这样使用唯一键:

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)

Dmitry Kaigorodov answered 2019-11-17T02:26:08Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值