您提到了外键,但尚不清楚是否id
是外键约束的引用或引用列。
If id
是引用的列你只需定义 fk 约束ON UPDATE CASCADE http://www.postgresql.org/docs/current/interactive/sql-createtable.html。然后你可以改变你的id
只要你想要的。更改会级联到相关列。
If id
是参考列(并且没有其他外键约束指向它),那么还有另一种更快的方法,因为PostgreSQL 9.0。您可以使用可延迟的主键或唯一键。考虑以下演示:
Note如果你想引用你就不能使用这个id
with a 外键来自另一个表的约束。我引用手册here http://www.postgresql.org/docs/current/interactive/sql-createtable.html:
引用的列必须是不可延迟唯一的列
或引用表中的主键约束。
Testbed:
CREATE TEMP TABLE t
( id integer
,txt text
,CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY DEFERRED
);
INSERT INTO t VALUES
(1, 'one')
,(2, 'two');
Update:
UPDATE t
SET id = t_old.id
FROM t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));
Result:
SELECT * FROM t;
id | txt
---+-----
2 | one
1 | two
您还可以声明约束DEFERRABLE INITIALLY IMMEDIATE
并使用SET CONSTRAINTS ... DEFERRED
在同一笔交易中。
请务必阅读手册中的详细信息:
- CREATE TABLE http://www.postgresql.org/docs/current/interactive/sql-createtable.html
- SET CONSTRAINTS http://www.postgresql.org/docs/current/interactive/sql-set-constraints.html
甚至似乎与DEFERRABLE INITIALLY IMMEDIATE
and no SET CONSTRAINTS
。我发布了一个对此的疑问 https://stackoverflow.com/q/10032272/939860.