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

错误

在我的PostgreSQL 9.4数据库中,我有一个表fields,该的列name具有唯一值。

我正在创建fields_new具有相似结构(此处不重要)和一列的新表name我需要一种方法来限制name要插入到中fields_new不存在的值fields.name

例如,如果fields.name包含值'color''length',则需要防止fields_new.name包含'color''length'值。因此,换句话说,我需要提供name两个表中的列之间没有任何重复的值。约束应该是双向的。

欧文·布兰德斯特

仅对新条目强制实施约束 fields_new

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

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

声明约束的无效性质NOT VALID(Postgres 9.1+)。这样,Postgres也不会在还原过程中尝试执行它(这可能会失败)。详细信息在这里:

该约束仅适用于新行。

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;

另外,当然,一个UNIQUEPRIMARY KEY约束上fields_new(name),以及对fields(name)

有关的:

双向执行

您可以再进一步一步,将上述CHECK约束反映在第二张桌子上。当两个事务同时写入两个表时,仍然不能保证避免恶劣的竞争条件。

或者,您可以使用触发器手动维护“物化视图”:两name的并集UNIQUE此处添加约束。不像对单个表的约束那样坚如磐石:可能存在同时写入两个表的竞争条件。但是可能发生的最坏情况是僵局,迫使事务被回滚。如果所有写操作都级联到“实例化视图”,则不会出现永久违规。

与此相关答案中的“阴暗面”类似:

只是,你需要触发器INSERT/ UPDATE/DELETE这两个表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

评估另一个表中是否不存在值

来自分类Dev

是否可以编写一个SQL查询来返回另一个表中不存在的值?

来自分类Dev

如何检查另一个数据帧中是否不存在字符串值?

来自分类Dev

如何检查组中是否存在一个值,另一个是否不存在?

来自分类Dev

SQL如何从另一个表中不存在的表中选择

来自分类Dev

如果列值在另一个表中不存在,则获取计数

来自分类Dev

当另一个表中不存在一个值时插入表中吗?

来自分类Dev

当另一个表中不存在一个值时插入表中吗?

来自分类Dev

SQL,如果另一个表中不存在该字段,则选择字段

来自分类Dev

SQL-不存在时不从另一个表中检索记录

来自分类Dev

SQL,如果另一个表中不存在该字段,则选择字段

来自分类Dev

如果值不存在,MYSQL 将值插入另一个表

来自分类Dev

SQL选择-插入值(如果不存在)按另一个值分组

来自分类Dev

SQL选择-插入值(如果不存在)按另一个值分组

来自分类Dev

检查值是否在另一个表中

来自分类Dev

SQL:检查一个表中是否存在另一个表中的条目,并删除重复项

来自分类Dev

SQL Server查询:获取另一个表的字段中不存在的列的列表

来自分类Dev

从一个表中删除ID为mysql中的另一个表中不存在的ID的值

来自分类Dev

删除另一个表中不存在ID的所有行

来自分类Dev

选择在实体框架的另一个表中不存在的记录

来自分类Dev

如何选择另一个表中不存在的行

来自分类Dev

获取另一个表中不存在的所有项目

来自分类Dev

SQLite查询选择另一个表中不存在的所有记录

来自分类Dev

需要选择另一个表中不存在的数据

来自分类Dev

如何选择另一个表中不存在的行

来自分类Dev

MySQL 查询不存在于另一个表中

来自分类Dev

如果不存在另一个值,如何基于一个值从表中选择项目?(雄辩/ sql)

来自分类Dev

如何获得一个表中另一个表中不存在的记录?

来自分类Dev

如何从一个表中获得的价值在另一个表中不存在?

Related 相关文章

  1. 1

    评估另一个表中是否不存在值

  2. 2

    是否可以编写一个SQL查询来返回另一个表中不存在的值?

  3. 3

    如何检查另一个数据帧中是否不存在字符串值?

  4. 4

    如何检查组中是否存在一个值,另一个是否不存在?

  5. 5

    SQL如何从另一个表中不存在的表中选择

  6. 6

    如果列值在另一个表中不存在,则获取计数

  7. 7

    当另一个表中不存在一个值时插入表中吗?

  8. 8

    当另一个表中不存在一个值时插入表中吗?

  9. 9

    SQL,如果另一个表中不存在该字段,则选择字段

  10. 10

    SQL-不存在时不从另一个表中检索记录

  11. 11

    SQL,如果另一个表中不存在该字段,则选择字段

  12. 12

    如果值不存在,MYSQL 将值插入另一个表

  13. 13

    SQL选择-插入值(如果不存在)按另一个值分组

  14. 14

    SQL选择-插入值(如果不存在)按另一个值分组

  15. 15

    检查值是否在另一个表中

  16. 16

    SQL:检查一个表中是否存在另一个表中的条目,并删除重复项

  17. 17

    SQL Server查询:获取另一个表的字段中不存在的列的列表

  18. 18

    从一个表中删除ID为mysql中的另一个表中不存在的ID的值

  19. 19

    删除另一个表中不存在ID的所有行

  20. 20

    选择在实体框架的另一个表中不存在的记录

  21. 21

    如何选择另一个表中不存在的行

  22. 22

    获取另一个表中不存在的所有项目

  23. 23

    SQLite查询选择另一个表中不存在的所有记录

  24. 24

    需要选择另一个表中不存在的数据

  25. 25

    如何选择另一个表中不存在的行

  26. 26

    MySQL 查询不存在于另一个表中

  27. 27

    如果不存在另一个值,如何基于一个值从表中选择项目?(雄辩/ sql)

  28. 28

    如何获得一个表中另一个表中不存在的记录?

  29. 29

    如何从一个表中获得的价值在另一个表中不存在?

热门标签

归档