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

AME*_*AME 6 sql postgresql foreign-key-relationship

假设我有两张桌子:CustomerCity.有许多人Customer住在同一个地方City.城市有一个uid主要关键.客户通过其对各自城市的外键引用Customer.city_uid.

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

是否有一种简单的方法可以将两个City.uids彼此交换以及Customer.city_uids?

doc*_*ore 5

一种解决方案可能是:

BEGIN;
1. Drop foreign key
2. Make update
3. Create foreign key
COMMIT;
Run Code Online (Sandbox Code Playgroud)

要么:

BEGIN;
1. Insert "new" correct information
2. Remove outdated information
COMMIT;
Run Code Online (Sandbox Code Playgroud)


Mat*_*lie 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
Run Code Online (Sandbox Code Playgroud)

(ID 没有被触及,但其他值被交换。功能上与交换 ID 相同,但使用“更软接触”查询,不需要对表约束等进行任何更改。)


然后,在关联的表中,您可以执行...

UPDATE
  Customer
SET
  city_uid = CASE WHEN city_uid = 1 THEN 2 ELSE 1 END
WHERE
  city_uid IN (1,2)
Run Code Online (Sandbox Code Playgroud)

但是,您还有其他参考表吗city_uid?如果是这样,您是否可以对所有这些表重复该更新?

  • 如果还有其他字段,则交换除 ID 字段之外的所有字段。这在功能上与交换 ID 字段***相同***。从字面上看,您将无法看到两种方法之间“city”表中的差异。过程中唯一的区别是您不需要尝试更新主键字段。如果其他表中存在其他依赖关系,则无论您采用哪种方法,这些依赖关系都会自行呈现。抱歉,如果我遗漏了一些东西,但我自己也有“似乎”相同的要求,这就是我所做的,并且它有效...... (3认同)