假设我有两个表:Customer
和City
。有很多Customer
住在同一个City
。城市有一个uid
是主键。客户通过Customer.city_uid
获得对其各自城市的外键引用。
出于外部原因,我必须互相交换两个City.uid
。但客户应该留在他们的城市。因此,有必要交换Customer.city_uid
s。所以我想我先交换City.uid
s然后通过Customer.city_uid
语句更改UPDATE
s。不幸的是,我不能这样做,因为这些uids
是从Customer
- 表引用的,PostgreSQL阻止我这样做。
是否有一种简单的方法可以将两个City.uid
彼此交换以及Customer.city_uid
s?
答案 0 :(得分:5)
一种解决方案可能是:
BEGIN;
1. Drop foreign key
2. Make update
3. Create foreign key
COMMIT;
或者:
BEGIN;
1. Insert "new" correct information
2. Remove outdated information
COMMIT;
答案 1 :(得分:1)
我的直觉是建议不要尝试更改city
表的id字段。但是这里缺少很多信息。所以它确实是感觉而不是明确的观点。
相反,我会在city
表的其他字段中交换值。例如,将city1的名称更改为city2的名称,反之亦然。
例如:
OLD TABLE NEW TABLE
id | name | population id | name | population
------------------------- -------------------------
1 | ABerg | 123456 1 | BBerg | 654321
2 | BBerg | 654321 2 | ABerg | 123456
3 | CBerg | 333333 3 | CBerg | 333333
(未触及ID,但其他值已被交换。功能上与交换ID相同,但使用“更柔和的触摸”查询,不需要对表约束进行任何更改等。 )
然后,在关联的表格中,您可以执行...
UPDATE
Customer
SET
city_uid = CASE WHEN city_uid = 1 THEN 2 ELSE 1 END
WHERE
city_uid IN (1,2)
但是,你有其他参考city_uid
的表吗?如果是这样,您是否可以在所有这些表上重复更新?
答案 2 :(得分:1)
您可以创建两个临时城市。
你会:
然后,您可以执行以下操作:
答案 3 :(得分:0)
您还可以在父表的ON UPDATE CASCADE
语句中添加CREATE TABLE
子句,如下所述: