【问题标题】:How to disable foreign key and primary key constraint temporarily in PostgreSQL?如何在 PostgreSQL 中临时禁用外键和主键约束?
【发布时间】:2016-04-20 05:53:30
【问题描述】:

我有一张有两个字段的表。结构是这样的:

CREATE TABLE raw_links
(
  value_id bigint NOT NULL,
  raw_id integer NOT NULL,
  CONSTRAINT raw_links_pk PRIMARY KEY (raw_id, dp_id),
  CONSTRAINT raw_fk FOREIGN KEY (raw_id)
      REFERENCES raw_data (raw_data_id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
)

我必须从这个表中删除 500 万条记录。为此,我想禁用这两个约束,以便删除更快。删除后我想创建两个约束。

【问题讨论】:

  • 您需要删除并重新创建它们。
  • 好吧,我会放弃,然后我会删除我的 500 万条记录。当我重新创建之后,它会抛出异常吗???因为这个表和 raw_data 表之间的记录可能不匹配。 .

标签: postgresql foreign-keys


【解决方案1】:

您可以使用ALTER TABLE DROP CONSTRAINT raw_links_pkraw_fk

删除记录后,首先执行VACUUM ANALYZE raw_links(或VACUUM FULL raw_links,如果要回收磁盘空间),以更新表统计信息。

然后最后用ALTER TABLE ADD CONSTRAINT ...重建约束。

【讨论】:

  • 好吧,我会放弃,然后我会删除我的 500 万条记录。当我重新创建之后,它会抛出异常吗???因为这个表和 raw_data 表之间的记录可能不匹配。 .
  • 只有在您执行此操作时raw_data.raw_data_id 有更新时才会发生这种情况。在这种情况下,您不能放弃约束,而应该在约束到位的情况下以缓慢的方式进行。
【解决方案2】:

例如。 Schema:source,Table:finalsales,Constrait:finalsales_pkey,Column:order_id。

--禁用主键

ALTER TABLE source."finalsales" DROP CONSTRAINT finalsales_pkey;

--启用主键

ALTER TABLE source."finalsales"
ADD CONSTRAINT finalsales_pkey PRIMARY KEY ( order_id );

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多