SQL 约束检查值是否不存在于另一个表中

2024-02-29

在我的 PostgreSQL 中9.4数据库,我有一个表fields有一个柱子name具有独特的价值观。

我正在创建一个新表fields_new具有类似的结构(这里不重要)和一个列name以及。我需要一种方法来约束name要插入的值fields_new不存在于fields.name.

例如,如果fields.name包含值'color' and 'length',我需要阻止fields_new.name来自包含'color' or 'length'价值观。所以,换句话说,我需要提供name两个表中的列之间没有任何重复值。而且约束应该是双向的。


仅对新条目强制执行约束fields_new

CHECK约束应该是不可变的,这通常排除对其他表的任何类型的引用,这些表本质上不是不可变的。

允许一些余地(特别是对于时间函数)STABLE功能是可以容忍的。显然,这在具有并发写访问的数据库中不能完全可靠。如果引用表中的行发生更改,则它们可能会违反约束。

Declare通过使您的约束无效NOT VALID http://www.postgresql.org/docs/current/interactive/sql-altertable.html(Postgres 9.1+)。这样,Postgres 也不会在恢复期间尝试强制执行它(这可能必然会失败)。详细信息在这里:

  • 恢复转储时禁用所有约束和表检查 https://dba.stackexchange.com/a/75635/3684

仅对新行强制执行该约束。

CREATE OR REPLACE FUNCTION f_fields_name_free(_name text)
  RETURNS bool AS
$func$
SELECT NOT EXISTS (SELECT 1 FROM fields WHERE name = $1);
$func$  LANGUAGE sql STABLE;

ALTER TABLE fields_new ADD CONSTRAINT fields_new_name_not_in_fields
CHECK (f_fields_name_free(name)) NOT VALID;

当然,再加上一个UNIQUE or PRIMARY KEY约束于fields_new(name)以及关于fields(name).

Related:

  • CONSTRAINT 检查远程相关表中的值(通过连接等) https://stackoverflow.com/questions/27107034/constraint-to-check-values-from-a-remotely-related-table-via-join-etc/27107470#27107470
  • 更新其他列有效性状态标志的函数? https://stackoverflow.com/questions/31588480/function-to-update-a-status-flag-for-validity-of-other-column/31592427#31592427
  • 触发器与检查约束 https://stackoverflow.com/questions/18409952/trigger-vs-check-constraint/18411888#18411888

双向执行

您可以更进一步并反映上述内容CHECK第二个表的约束。当两个事务同时写入两个表时,仍然不能保证避免出现令人讨厌的竞争条件。

Or您可以使用触发器手动维护“物化视图”:两者的联合name列。添加一个UNIQUE那里的约束。不像单个表上的相同约束那样坚如磐石:同时写入两个表可能存在竞争条件。但可能发生的最坏情况是死锁迫使事务回滚。如果所有写操作都级联到“物化视图”,则不会出现永久性违规。

类似于此相关答案中的“黑暗面”:

  • PostgreSQL 可以对数组元素有唯一性约束吗? https://stackoverflow.com/questions/8016776/can-postgresql-have-a-uniqueness-constraint-on-array-elements/8017013#8017013

只是你需要触发器INSERT / UPDATE / DELETE在两张桌子上。

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

SQL 约束检查值是否不存在于另一个表中 的相关文章

  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 消息 203,级别 16,状态 2,不是有效标识符

    我收到以下错误 消息 203 级别 16 状态 2 过程 getQuestion 第 18 行名称 select top 1 from tlb Question inner join tlb options on tlb options q
  • 如何确定层级组织中的权限?

    我正在尝试创建高性能逻辑来确定分层组织内的权限 员工被分配到一个或多个单位 单元是分层的 理论上 无限深度 实际上不超过 6 层 例如 员工Jane可能是Supervisor of the Accounts Receivable单元 的子单
  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu
  • SQL Server:如果存在会大大减慢查询速度

    正在使用SQL Server 2012 我找到了一些关于查询优化的主题 并将 EXISTS 与 COUNT 进行比较 但我找不到这个确切的问题 我有一个看起来像这样的查询 select from tblAccount as acc join
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是
  • 如何在Word 2010中从SQL数据库检索数据?

    我想用 MS SQL 数据库中的数据填充 Word 文档 这可能吗 如果可能的话 如何实现 我过去曾通过多种方式做到这一点 这取决于用户是从 Microsoft Word 外部还是从 Microsoft Word 内部启动操作 From I
  • 就SQL注入而言,哪种sql查询更安全

    我有两个 SQL 查询正在尝试更新sup and opp每次调用查询时 值分别为 1 和 1 第一个查询 query update disc set sup sup opp opp where did did int sup getnoof
  • SQL Server - 选择满足条件的第一行

    我有 2 个包含 ID 的表 其中一个表中会有重复的 ID 我只想为表 B 中的每个匹配 ID 返回一行 例如 Table A objectIdA objectIdB 1 A 1 B 1 D 5 F Table B objectIdA 1
  • postgresql 选择不同的最新记录

    我有一个像这样的表 id fkey srno remark date 1 A001 1 2 A001 2 3 A002 1 4 A003 1 5 A002 2 我想要基于 max srno 的不同最新记录 例如 2 A001 2 4 A00
  • PostgreSQL 和锁定

    希望一些比我更聪明的 DBA 可以帮助我找到一个好的解决方案来完成我需要做的事情 为了便于讨论 我们假设我有一个名为 work 的表 其中包含一些列 其中一列表示给定客户端对该行工作的所有权 场景是 我将连接 2 个客户端并轮询表以查找要完
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 如何避免连接两个表时重复

    Student Table SID Name 1 A 2 B 3 C Marks Table id mark subject 1 50 physics 2 40 biology 1 50 chemistry 3 30 mathematics
  • 访问数据库 LIMIT 关键字

    我试图让我的页面列表功能在 ASP 中与 Access 数据库一起工作 但我不知道 Microsoft SQL 中 LIMIT 的替代方案 我已经尝试过 TOP 但这似乎不起作用 这是 MySQL 中使用的语句 SELECT FROM cu
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我

随机推荐

  • Java 中的 StAX XML 格式化

    是否可以使用 StAX 特别是 woodstox 使用换行符和制表符格式化输出 xml 即采用以下形式
  • sbt 0.13.8 URI 有一个权限组件

    在 sbt 项目中运行 sbt 时出现此错误 我有 JDK 8 和 sbt 0 13 8 我可以毫无问题地运行 activator 命令 但我需要 sbt 工作 因为我的 IDE IntelliJ IDEA 使用它来加载项目 E work
  • ebean 和 play 框架中的复合键

    我刚刚开始使用 Play 框架 完成教程 涵盖基本功能 后 我尝试在数据库和游戏之间设置连接 我的一个关系有模式 CREATE TABLE IF NOT EXISTS shop CatPath parentC INT NOT NULL ch
  • 即使使用 sudo,也无法以 +x 权限执行脚本文件

    我无法从已安装的分区运行脚本 我创建了一个基本的 Hello World 脚本 可以从我的主目录正常执行 但是当我将其移动到已安装的分区时 我无法执行该文件 ls l rwxr xr x 1 user user 31 Mar 4 21 33
  • -1103错误域= NSURLErrorDomain代码= -1103“资源超出最大大小”iOS 13

    当 iOS 13 上的响应较大 14kb 时 我们会遇到以下网络错误 1103 Error Domain NSURLErrorDomain Code 1103 resource exceeds maximum size 由于我们使用 Ala
  • ExtJS 中自动调整文本字段标签大小

    在 ExtJS 中 是否可以将文本字段的标签调整为最佳大小以使其文本适合一行 The labelWidth http docs sencha com extjs 4 1 1 api Ext form Labelable cfg labelW
  • 按字母顺序搜索名称的查询

    我已经用过LIKE条件 但它要求我将全名输入数据库才能找到名称 if searchby equals Name try Class forName sun jdbc odbc JdbcOdbcDriver System out printl
  • 即使忘记了“new”,我什么时候应该自动创建一个对象?

    假设我有以下对象构造函数 function Foo bar this bar bar 如果我在全局范围内运行该函数而不使用new关键字然后bar将被设置在任何范围内Foo 被称为 var foo Foo 42 console log bar
  • 为什么C风格的注释会让insert语句运行两次?

    长话短说 我开始遇到 ORA 00001 主键违规 我追踪到这个问题 因为我的一些INSERT INTO语句运行了两次 然后我发现有问题的命令之后有一个 C 风格的注释 WHENEVER SQLERROR EXIT FAILURE SET
  • 有没有办法像 withCString 一样链接函数?

    有没有办法链接像这样的函数withCString 我的意思是任何 函数看起来像f Foo gt CFoo gt IO a gt IO a 例如 假设有一个函数cFunc CString gt CFoo gt CBar gt IO 通常 我会
  • 用于确保 shell 脚本在任何给定时间仅运行一个实例的 Shell 片段 [重复]

    这个问题在这里已经有答案了 可能的重复 确保一次只运行一个 shell 脚本实例的快速而肮脏的方法 https stackoverflow com questions 185451 quick and dirty way to ensure
  • 每秒写入文件数

    我想将访问率较高的网站的访问记录下来并存档 每秒可以对日志文件执行多少写入 如果您无法使用 Analytics 为什么不使用网络服务器现有的日志系统呢 如果您使用的是真正的网络服务器 那么它几乎肯定是一种已经针对最大吞吐量进行了优化的日志记
  • CollisionBitMask 如何工作? Swift/SpriteKit

    据我所知 物理体的默认设置是当它们相互碰撞时会相互弹开 直到您将它们的碰撞位掩码设置为相同的数字 然而 由于我相信碰撞位掩码 我在完成看起来应该非常简单的事情时遇到了一个巨大的问题 let RedBallCategory UInt32 0x
  • 订阅主题的 Angular HTTP 调用关闭主题

    我有两个可以获取给定对象的服务 用于获取完整列表的初始 HTTP 调用 以及用于实时更新新元素的 Websocket 通知 我想将这两个调用连接到同一个可观察对象 以便显示页面不了解后端 有这样的电话 private getInitialD
  • UIWebView:禁用富文本编辑器的复制/剪切选项

    我有一个带有 contentEditable div 的 UIWebView 来实现某种富文本编辑器 一旦用户选择任何文本片段 我需要修剪 UIMenuController 中出现在 Web 视图中的复制和剪切选项 网络上似乎有很多解决方案
  • hive 0.14 更新和删除查询配置错误

    在阿帕奇中hive 0 14我们可以通过支持更新和删除查询ACID配置 hive configuration hive support concurrency true hive enforce bucketing true hive ex
  • 在Qt中获取本地IP地址

    有没有跨平台的方法来获取本地IP地址 即看起来像192 168 1 49 使用Qt的计算机 我想为 Symbian 手机创建一个 FTP 服务器 并且想显示 FTP 客户端应连接的 IP 地址 Use QNetworkInterface a
  • 如何追加多个文本文件并将每个文件名放入 pandas 的新列中?

    我有很多 txt文件夹中的文件 每个文件具有相同的结构 每个文件中的四列相同 但行数不同 1 txt 0 00781238 0 00082577 0 00781238 0 03314453 0 01562476 0 00064219 0 0
  • opencv - 使用特征检测进行对象跟踪

    我想跟踪视频中的一个对象 例如 移动的球 参考opencv教程 Features2D Homography来查找已知对象 我已经能够通过提供参考图像来跟踪静态图像中的对象 我计划使用参考图像从输入视频的第一帧中检测移动物体 对于下一帧 在前
  • SQL 约束检查值是否不存在于另一个表中

    在我的 PostgreSQL 中9 4数据库 我有一个表fields有一个柱子name具有独特的价值观 我正在创建一个新表fields new具有类似的结构 这里不重要 和一个列name以及 我需要一种方法来约束name要插入的值field