用SQL有效地反转外键

时间:2015-08-28 10:14:02

标签: sql postgresql foreign-keys

我有两张桌子

Husband
---------
id
name
....

Wife
---------
id
name
husband_id (REFERENCES husband)
...

现在我想扭转这种关系。这意味着丈夫应该有一个妻子参考妻子,妻子的丈夫应该被移除。

改变表格不是一种交易。但设置wife_id效率是。你应该看到有很多条目。

首先我尝试了简单的方法:

UPDATE husband h SET wife_id =
  (SELECT id FROM wife w WHERE w.husband_id=h.id)

它首先在一个小型数据库上尝试,并意识到子选择是如此之慢,以至于实时数据库上的更新将花费> 4h,这是不可接受的。

那么,如何更快地解决这个问题?

顺便说一下。它是Postgres 9.3.5数据库,afaik没有设置特殊索引。

2 个答案:

答案 0 :(得分:1)

您可以使用JOIN,它应该比共同相关的子查询更快:

UPDATE husband h
   SET wife_id = w.id
FROM wife w 
WHERE w.husband_id = h.id;

答案 1 :(得分:0)

a_horse_with_no_name的解决方案带来了一些性能。但真正的绩效推动伴随着一个指数:

CREATE INDEX husband_id_index ON wife (husband_id);
REINDEX INDEX alt_md_index; -- not sure if this isn't required

索引查询本身只用了5秒钟。但是连接查询的速度提高了大约30,000倍,并且在大约30秒内完成。我非常惊讶,并且会更频繁地使用索引。