9

と の 2 つのテーブルがあるCustomerとしCityます。Customer同じ に 住んでいるがたくさんありますCity。都市には、uid主キーである があります。顧客は、 を介してそれぞれの都市への外部キー参照を持っていますCustomer.city_uid

City.uid外部の理由により、2 つの s を互いに交換する必要があります。しかし、顧客は自分たちの街に愛着を持ち続ける必要があります。Customer.city_uidしたがって、 s も交換する必要があります。だから私は最初に s を交換し、次にステートメントを介して sCity.uidをそれに応じて変更すると思いました。残念ながら、これらは-table から参照されているため、これを行うことはできません。PostgreSQL ではそれができません。Customer.city_uidUPDATEuidsCustomer

City.uids だけでなく、2 つの s を互いに交換する簡単な方法はありCustomer.city_uidますか?

4

4 に答える 4

6

1つの解決策は次のとおりです。

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 に答える