AME*_*AME 6 sql postgresql foreign-key-relationship
假设我有两张桌子:Customer
和City
.有许多人Customer
住在同一个地方City
.城市有一个uid
主要关键.客户通过其对各自城市的外键引用Customer.city_uid
.
City.uid
出于外部原因,我必须互换两个s.但客户应该留在他们的城市.因此有必要交换Customer.city_uid
s.所以我想我首先交换City.uid
s然后Customer.city_uid
通过UPDATE
-statement 更改sinliy.不幸的是,我不能这样做,因为这些uids
是从Customer
-table 引用的,PostgreSQL阻止我这样做.
是否有一种简单的方法可以将两个City.uid
s彼此交换以及Customer.city_uid
s?
一种解决方案可能是:
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)
我的直觉是建议不要尝试更改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
?如果是这样,您是否可以对所有这些表重复该更新?