当前位置: 首页 > 知识库问答 >
问题:

多列主键中的NULL值

陈哲
2023-03-14

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

但是,当我运行描述测试时,它显示如下:

|| *Field* || *Type*                || *Null* || *Key* || *Default* || *Extra* 
|| Field1  || smallint(5) unsigned  || NO     || PRI   ||           ||         
|| Field2  || decimal(5,2) unsigned || NO     || PRI   || 0.00      ||         

在插入NULL值时,我一直收到错误。

列“Field2”不能为空

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

共有3个答案

上官恩
2023-03-14

主键声明列不能有NULL值。因此,用于定义复合主键的列不会是NULL

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

此外,看看这个线程:复合主键中的可空列有什么问题?。

此链接提供了有关组合键中可能存在 NULLABLE 列的宝贵信息!

傅安宁
2023-03-14

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

为了插入 NULL 值,请将字段 2 设为唯一。

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

廖永长
2023-03-14

从MySQL留档:

主关键字

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

https://dev.mysql.com/doc/refman/8.0/en/create-table.html

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

 类似资料:
  • 问题内容: 我正在尝试学习如何使用键并打破习惯,即我所有表中的所有行都必须具有类型ID。同时,我也在进行多对多关系,因此在需要协调关系的表的任一列上要求唯一值会妨碍这一点。 我如何在表上定义主键,以便任何给定的值都可以在任何列中重复,只要永不完全重复所有列中的值组合即可? 问题答案: 从CREATE TABLE语法页面引用: 主键可以是多列索引。但是,您不能使用列规范中的PRIMARY KEY键属

  • 问题内容: 我正在使用节点编写其余部分,将其序列化为mySQL的ORM。我正在使用bulkCreate函数批量创建记录。但是作为响应,它为主键值返回 null 。 模型 批量创建操作: 回应: 问题答案: 您应该设置以下选项:

  • 问题内容: 经过搜索,没有找到这个特定的菜鸟问题的答案。如果我错过了,我深表歉意。 在MySQL数据库中,我有一个带有以下主键的表 主键ID(发票,项目) 在我的应用程序中,我也会经常自己选择“项目”,而很少选择“发票”。我假设我将从这些列的索引中受益。 当我定义以下内容时,MySQL不会抱怨: 索引(发票),索引(项目),主键ID(发票,项目) 但是,我没有看到任何证据(使用DESCRIBE-我

  • 错误结果为 “OneToOne关系的JPA问题:外键引用的列数错误。应为2” 如何为join测试表指定主键? 表A:列id与表B:列test_id映射

  • 在本方案中: Hibernate按预期创建了两个表: Envers还创建两个表: 创建表(bigint(20)不为空,int(11)不为空,tinyint(4)默认为空,主键(,),键(),约束 而且 创建表(int(11)不为NULL,bigint(20)不为NULL,varchar(255)不为NULL,tinyint(4)默认为NULL,主键(,,),约束 问题出在第二个审核表(testen

  • 尝试通过REST Post方法插入Student对象时得到以下错误 2020-10-08 18:50:08.799错误21708---[nio-8080-exec-7]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()在路径[]上下文中的servlet[dispatcherServlet]引发异常[请求处理失败;嵌套异常是org.spri