为什么我可以在可为空的列上创建带有主键的表?

2024-04-06

以下代码创建一个表,不会引发任何错误:

CREATE TABLE test(
ID INTEGER NULL,
CONSTRAINT PK_test PRIMARY KEY(ID)
)

请注意,我无法按预期插入 NULL:

INSERT INTO test
VALUES(1),(NULL)
ERROR:  null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null).
********** Error **********

ERROR: null value in column "id" violates not-null constraint
SQL state: 23502
Detail: Failing row contains (null).

为什么我可以创建一个定义自相矛盾的表? ID 列作为 PRIMARY KEY 的一部分被显式声明为可为 NULL,并且不能隐式为 NULL。是否有意义?

编辑:如果这个自相矛盾的 CREATE TABLE 就在那里失败不是更好吗?


因为PRIMARY KEY makes包含的列NOT NULL 自动地。我引用手册在这里 https://www.postgresql.org/docs/current/sql-createtable.html:

主键约束指定一个或多个列 表只能包含唯一(非重复)、非空值。 从技术上来说,PRIMARY KEY只是一个组合UNIQUE and NOT NULL.

大胆强调我的。

我进行了测试来确认NOT NULL与一个组合是完全多余的PRIMARY KEY约束(在当前实现中,在版本 13 中重新测试)。这NOT NULL约束保持即使在删除 PK 约束之后,无论显式如何NOT NULL创建时的子句。

CREATE TABLE foo (foo_id int PRIMARY KEY);
ALTER TABLE foo DROP CONSTRAINT foo_pkey;
db=# \d foo
   table »public.foo«
 column |  type   | attribute
--------+---------+-----------
 foo_id | integer | not null    -- stays

数据库小提琴

相同的行为如果NULL包含在CREATE TABLE陈述。

保留仍然不会有什么坏处NOT NULL如果该列应该是,则在代码存储库中是多余的NOT NULL。如果您稍后决定更改 PK 约束,您可能会忘记标记该列NOT NULL- 或者它是否应该是NOT NULL.

有一个Postgres TODO wiki 中的项目 https://wiki.postgresql.org/wiki/Todo#CREATE解耦NOT NULL来自PK约束。所以这可能会在未来的版本中改变:

将 NOT NULL 约束信息移至 pg_constraint

当前 NOT NULL 约束存储在 pg_attribute 中,没有任何其来源的指定,例如主键。一份舱单 问题是删除 PRIMARY KEY 约束并不会删除 NOT NULL 约束指定。另一个问题是我们应该 可能会强制 NOT NULL 从父表传播到 子项,就像 CHECK 约束一样。 (但随后下降 主键影响儿童吗?)

回答添加的问题

如果这个自相矛盾的 CREATE TABLE 只是 就在那里失败了?

如上所述,这

foo_id INTEGER NULL PRIMARY KEY

(目前)100% 相当于:

foo_id INTEGER PRIMARY KEY

Since NULL在这种情况下被视为干扰词。
我们不希望后者失败。所以这不是一个选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我可以在可为空的列上创建带有主键的表? 的相关文章

随机推荐

  • 如何在 T-SQL 中将 varchar 转换为 datetime?

    我正在尝试填充来自的数据table1 to table2 两者具有相同的列数 中的所有列table1属于类型varchar 中的列table2可能varchar int or datetime etc 我的问题是如何在填充过程中进行转换 这
  • 更改重复产品的 Magento 默认状态

    我安装了 Magento 商店 当后端复制产品时 Magento 默认将其状态设置为禁用 我不希望发生这种情况 复制的产品也应该从原始产品复制其状态 In 这个帖子 https stackoverflow com questions 465
  • Asp.net core 2 CORS预检请求响应缓慢

    我们有一个 asp net core 2 服务器 在性能测试中 当我们有几个 例如数十个 待处理请求时 新的 CORS 预检请求将保持待处理状态 看来asp net core对管道中的并发请求数有一定的限制 并且该限制的默认值非常低 是否有
  • Laravel 事件超出 Pusher 允许的限制

    我的 Laravel 应用程序中有一个事件 对于特定记录 它超出了 Pusher 允许的最大限制 10240 字节 Laravel 序列化 Event 类上的每个公共属性是否正确 如果是这样 我怀疑序列化模型不应超过 10kb 限制 但无论
  • 必须满足哪些条件才能通过 WPF DataGrid 编辑自定义集合?

    In short 我有自定义集合 我想使用数据网格显示和编辑 GUI 方式 第一部分 展示 有效 第二个 编辑 则不然 第一次尝试交互式编辑 由用户 时 我收到错误异常 EditItem is not allowed for this vi
  • 使外部 div 自动与其浮动内容高度相同

    我想要外层div 用黑色包裹它div漂浮在其中 我不想用style height 200px in the div与outerdivid 因为我希望它自动成为其内容的高度 例如 浮动divs div style border 1px sol
  • 无法打开与您的身份验证代理的连接

    我遇到了以下错误 git push heroku master Warning Permanently added the RSA host key for IP address 50 19 85 132 to the list of kn
  • 使用“array-contains”查询 Cloud Firestore 社交媒体结构

    我有一个由称为 民意调查 的集合组成的数据结构 民意调查 有几个具有随机生成 ID 的文档 在这些文档中 还有一个名为 答案 的附加集合集 用户对这些民意调查进行投票 所有投票都写入 答案 子集合中 我在 answers 节点上使用 run
  • 从 JQuery 向 Web API 进行 POST 时出现问题[重复]

    这个问题在这里已经有答案了 我有一个带有以下 POST 方法的 Web api public HttpResponseMessage Post FromBody string package 我有一个控制台应用程序 使用HttpCLient
  • 在 AspNetCore 与 TestServer 的集成测试中模拟并解决 Autofac 依赖关系

    我正在使用 AspNetCore 2 2 遵循 更多 此处的文档 https learn microsoft com en us aspnet core test integration tests view aspnetcore 2 2
  • C++ 中的字符串到枚举

    有没有办法将文本文件中的字符串与枚举值相关联 问题是 我有一些枚举值作为字符串存储在文本文件中 我在满足某些条件时即时读取这些值 现在我想将读取的值分配给枚举 最有效的方法是什么 它不需要是最简单的方法 您可以设置一张可以反复使用的地图 t
  • 如何使用 CMake 正确添加包含目录

    大约一年前我问过CMake 中的标头依赖项 https stackoverflow com questions 7461000 handling header files dependencies with cmake 我最近意识到问题似乎
  • 将自定义 MD5 公式与 ARRAYFORMULA 结合使用

    我实现了一个 MD5 公式 如下所述 function MD5 input var rawHash Utilities computeDigest Utilities DigestAlgorithm MD5 input Utilities
  • 如何判断我的应用程序是作为 32 位应用程序还是 64 位应用程序运行?

    如何判断我的应用程序 在 Visual Studio 2008 中编译为Any CPU 是作为 32 位还是 64 位应用程序运行 如果您正在使用 NET http en wikipedia org wiki NET Framework4
  • 如何禁止chrome打开“新窗口”和“标签”?

    他们是否可以通过 Chrome 浏览器设置将互联网上的所有页面保留在一个窗口中 或者我可以用一个插件 插件来做到这一点 当我单击某些链接时 我不希望在新选项卡和 或新窗口中打开网页 如果有人有任何建议请告诉我 谢谢 a href http
  • 在 Jenkins 中运行 Selenium 测试

    我通过 Selenium IDE 记录了一些简单的 Selenium 测试 现在我想在 Jenkins 中运行这些测试 我需要 Jenkins 的哪个插件才能做到这一点 以及如何逐步运行测试 感谢帮助 您可以使用录制的 selenium I
  • std::function 与 lambda 的比较

    如何比较 std function 和 lambda include
  • 改造和持久 cookie 存储

    在改造中实现持久 cookie 存储的最简单方法是什么 现在我正在使用这个 cookieManager new CookieManager cookieManager setCookiePolicy CookiePolicy ACCEPT
  • 字段列表中的 EF4 未知列

    所以 我有点难住了 我一直在使用通用存储库 它工作得很好 它位于实体框架 4 1 之上 我曾多次使用同一行代码来获取一组数据 之前没有任何问题 然而 我的数据库中的这张表似乎抛出了异常 我一生都无法弄清楚如何修复它 这是MySQL数据库中的
  • 为什么我可以在可为空的列上创建带有主键的表?

    以下代码创建一个表 不会引发任何错误 CREATE TABLE test ID INTEGER NULL CONSTRAINT PK test PRIMARY KEY ID 请注意 我无法按预期插入 NULL INSERT INTO tes