2012-10-15 83 views
6

假設我有兩個表格:CustomerCity。有很多Customer住在同一個City。這些城市的主要關鍵是uid。客戶通過Customer.city_uid可以獲得對各自城市的外部參照。如何更改postgresql中的外鍵值?

由於外在原因,我必須互相交換兩個City.uid。但客戶應該留在他們的城市。因此有必要更換Customer.city_uid。所以我想我先交換City.uid s,然後通過UPDATE -statement更改Customer.city_uid s。不幸的是,我不能這樣做,因爲這些uids引用自Customer -table,PostgreSQL阻止我這樣做。

是否有簡單的方法將兩個City.uid與另一個以及Customer.city_uid s交換?

+0

如果您有N個引用「主」(在您的情況下爲城市)表中的表格,則問題會變得更大。到目前爲止,這是我最喜歡的解決方案:http://stackoverflow.com/a/18273069/633961(但我仍然在尋找更好的方法來解決這個問題)。 – guettli

回答

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?如果是這樣,你可以在所有這些表格上重複更新嗎?

+0

但是,謝謝你,這是不可能的。我真的需要改變uid。 – AME

+0

你能解釋更多嗎?如果「uid = 1」現在與「uid = 2」曾經擁有的城市名稱等相關聯,那麼您是否做過同樣的事情?這個問題在哪些方面不足?只是爲了我們可以提出替代解決方案。 – MatBailie

+0

添加了一個可視化示例,顯示交換名稱等功能與交換ID字段相同。 – MatBailie

4

一種解決方案可能是:

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
  • 市2
  • 城市氣溫1
  • 城市氣溫2

然後,你可以做如下:

  1. 名更新所有客戶的UID從市1至城市氣溫1
  2. 更新所有客戶的UID從市2到城市氣溫2
  3. 交換城市1和2的UID
  4. 移動從城市氣溫1所有客戶回城1.
  5. 將所有客戶從城市溫度2移回城市2.
  6. 刪除暫時的城市。