使用外键约束

时间:2015-09-24 14:45:35

标签: sql postgresql sql-delete

我在使用SQL DELETE查询时遇到了一些麻烦。 我使用2个表(父和子)在数据库(postgres 9.3)上工作。 孩子与父母有外键关系。

父表

CREATE TABLE parent
(
  id bigint NOT NULL,
  ...
  CONSTRAINT parent_pkey PRIMARY KEY (id)
)

儿童表

CREATE TABLE child
(
  id bigint NOT NULL,
  parent_id bigint,
  ...
  CONSTRAINT child_pkey PRIMARY KEY (id),
  CONSTRAINT fk_adc9xan172ilseglcmi1hi0co FOREIGN KEY (parent_id)
      REFERENCES parent (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

我在两个表中插入了200'000条,没有任何关系(Child.parent_id = NULL)

但是像下面这样的DELETE查询的持续时间超过20分钟。 即使没有WHERE条件,也是如此。

DELETE FROM Parent;

如果我不添加关系约束,则执行时间将在400毫秒内完成。

我错过了什么?

可行的解决方案是以下示例。但我不知道这是不是一个好主意。也许任何人都可以告诉我更好的方法。

BEGIN WORK;
ALTER TABLE Parent DISABLE TRIGGER ALL;
DELETE FROM Parent;
ALTER TABLE Parent ENABLE TRIGGER ALL;
COMMIT WORK;

1 个答案:

答案 0 :(得分:2)

Parent删除时,需要Child查询parent_id表,以确保没有子行引用您要删除的父行。

为确保子查找快速运行,您需要在parent_id表中的Child列上添加索引。