gpt4 book ai didi

postgresql-9.3 - 在 postgresql 9.3.5 上启用和禁用约束时出错

转载 作者:行者123 更新时间:2023-12-02 21:20:25 25 4
gpt4 key购买 nike

我有一个要求,涉及在centos6.5机器上运行的postgresql 9.3.5中批量加载数据。这个想法是在批量加载之前禁用约束,并在数据加载完成后再次启用。我禁用约束没有问题,当我尝试再次启用时出现问题。

我用来禁用约束的sql命令:

alter table myTableA drop constraint myTableA_id_fkey cascade;
alter table myTableB drop constraint myTableB_id_fkey cascade;
alter table myTableC drop constraint myTableC_id_fkey cascade;

我想用来启用约束的sql命令:

ALTER TABLE myTableA ADD CONSTRAINT myTableA_id_fkey;
ALTER TABLE myTableB ADD CONSTRAINT myTableB_id_fkey;
ALTER TABLE myTableC ADD CONSTRAINT myTableC_id_fkey;

但是当我尝试启动启用约束时,我收到以下消息:

ERROR:  syntax error at or near ";"

第 1 行:...oor_element 添加约束 myTableA_id_fkey;

来源:

我做错了什么?

另一个问题,每次使用这种方式加载数据库时都这样做是个好主意吗?应该是每天执行一次批量加载。

http://www.postgresql.org/docs/9.3/static/sql-altertable.html

最佳答案

您没有启用/禁用约束。你正在删除并重新创建它们。重新创建它们时,您必须再次定义它们,因为当您告诉数据库时,数据库会丢弃它们的知识。

也许您打算禁用而不是放弃约束?

如果是这样:你不能这样做。没有DISABLE CONSTRAINTS选项或类似的东西。

因此,在 PostgreSQL 提供暂时禁用数据加载约束的正确方法之前,最好的方法可能是每次删除并重新创建约束。

为此,您必须使用正确、完整的 ALTER TABLE ... ADD CONSTRAINT ...具有完整约束定义的命令。


(以下风险会导致无法检测到且无效的 FK 违规。除非您确实非常确定需要这样做,否则不要这样做,而只需删除并重新创建上述约束即可。)

对于外键约束,您可以做什么,尽管这不是一个好主意,但是:

  • 使用 ALTER TABLE ... DISABLE TRIGGER ALL 禁用实现约束检查的系统触发器
  • 做好你的工作
  • 使用 ALTER TABLE .. ENABLE TRIGGER ALL 重新启用外键约束触发器

请注意,这是非常严厉的,仅影响 FOREIGN KEY约束(不是 CHECKNOT NULLEXCLUSIONPRIMARY KEYUNIQUE 等约束)并且通常很丑陋。

最重要的是,这永远不会验证约束实际上是正确的,但您可以通过额外的技巧来做到这一点:将每个约束标记为 NOT VALID在目录中然后使用 VALIDATE CONSTRAINT 重新验证它。 PostgreSQL 不提供公共(public)且受支持的方法来将现有 FK 约束标记为 NOT VALID ,所以没有适当安全的方法来做到这一点。


理想情况下,PostgreSQL 允许外键检查约束为 FOR EACH STATEMENTDEFERRABLE ,所以你可以将它们推迟到提交为止。但这目前并没有帮助,因为他们仍然必须对每一行运行一次检查,因此批量执行此操作没有任何节省。如果 PostgreSQL 在某个时刻获得对语句级触发器中已更改元组的虚拟表的支持(正如最近在 pgsql-hackers 上讨论的那样),这可能是可能的。

关于postgresql-9.3 - 在 postgresql 9.3.5 上启用和禁用约束时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28043226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com