我在使用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;
答案 0 :(得分:2)
从Parent
删除时,需要Child
查询parent_id
表,以确保没有子行引用您要删除的父行。
为确保子查找快速运行,您需要在parent_id
表中的Child
列上添加索引。