如何在postgresql中更改外键的值?

时间:2012-10-15 09:31:59

标签: sql postgresql foreign-key-relationship

假设我有两个表:CustomerCity。有很多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?

4 个答案:

答案 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)

您可以创建两个临时城市。

你会:

  • 城市1
  • City 2
  • City Temp 1
  • City Temp 2

然后,您可以执行以下操作:

  1. 将所有客户UID从City 1更新为City Temp 1。
  2. 将所有客户UID从City 2更新为City Temp 2。
  3. 交换城市1和2 UID
  4. 将所有客户从City Temp 1移回城市1。
  5. 将所有客户从City Temp 2移回City 2.
  6. 删除暂时的城市。

答案 3 :(得分:0)

您还可以在父表的ON UPDATE CASCADE语句中添加CREATE TABLE子句,如下所述:

How to do a cascading update?