AME*_*AME 6 sql postgresql foreign-key-relationship
假设我有两张桌子:Customer和City.有许多人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?
一种解决方案可能是:
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?如果是这样,您是否可以对所有这些表重复该更新?
| 归档时间: |
|
| 查看次数: |
10451 次 |
| 最近记录: |