9

假设我有两个表:CustomerCity. 有很多Customers住在同一个City。城市有一个uid主键。客户通过 具有指向其各自城市的外键引用Customer.city_uid

City.uid由于外部原因,我必须相互交换两个s。但客户应该与他们的城市保持联系。因此,也有必要交换Customer.city_uids。所以我想我首先交换City.uids ,然后Customer.city_uid通过UPDATE-statement 相应地更改 s 。不幸的是,我不能这样做,因为这些uids是从Customer-table 引用的,而 PostgreSQL 阻止我这样做。

有没有一种简单的方法可以将两个City.uids 以及 s 相互交换Customer.city_uid

4

4 回答 4

6

一种解决方案可能是:

BEGIN;
1. Drop foreign key
2. Make update
3. Create foreign key
COMMIT;

或者:

BEGIN;
1. Insert "new" correct information
2. Remove outdated information
COMMIT;
于 2012-10-15T09:52:54.130 回答
1

我的直觉是建议不要尝试更改city表的 id 字段。但是这里缺少很多信息。因此,这确实是一种感觉,而不是确定的观点。

相反,我会交换表格其他字段中的值。例如,将 city1 的名称更改为 city2 的名称,反之亦然。city

例如:

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吗?如果是这样,您是否可以在所有这些表上重复该更新?

于 2012-10-15T09:42:28.773 回答
1

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

你将会拥有:

  • 城市 1
  • 城市 2
  • 城市温度 1
  • 城市温度 2

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

  1. 将所有客户 UID 从 City 1 更新为 City Temp 1。
  2. 将所有客户 UID 从 City 2 更新为 City Temp 2。
  3. 交换城市 1 和 2 UID
  4. 将所有客户从 City Temp 1 移回 City 1。
  5. 将所有客户从 City Temp 2 移回 City 2。
  6. 删除临时城市。
于 2018-02-21T18:52:13.003 回答
0

You can also add an ON UPDATE CASCADE clause to the parent table's CREATE TABLE statement, as described here:

How to do a cascading update?

于 2020-05-18T15:29:34.840 回答