1

次のような 2 つのテーブルがあります。

CREATE TABLE rooms (rid CHAR PRIMARY KEY);
CREATE TABLE users (uid INT PRIMARY KEY, rid CHAR FOREIGN KEY REFERENCES rooms(rid))

ターゲットは、rid のキー (テーブルや列ではなく、値) の名前を次のように変更することです。

BEGIN TRANSACTION;
UPDATE rooms
SET rid = "9"||SUBSTRING(rid, 2)
WHERE TEXT(rid) LIKE "5%";
UPDATE users
SET rid = "9"||SUBSTRING(rid, 2)
WHERE TEXT(rid) LIKE "5%";
END TRANSACTION;

もちろん、これは外部キー制約のエラーで終了します。

多くの場合、名前変更のコンテキストで「sp_rename」が呼び出されます。しかし、値ではなく、テーブルと列でのみ機能することを理解していました。

外部キー制約の値の名前を変更する方法は?

.

解決済み:

BEGIN TRANSACTION;

ALTER TABLE users
DROP CONSTRAINT users_rid_fkey,
ADD FOREIGN KEY (rid) REFERENCES rooms(rid) ON UPDATE CASCADE ON DELETE RESTRICT;

UPDATE rooms
SET rid = '9'||SUBSTRING(rid, 2)
WHERE rid LIKE '5%';

END TRANSACTION;
4

1 に答える 1

2

いくつかのアプローチがあります…つまり:

  1. 制約を削除し、データを更新して、制約を再度追加します。

  2. になるように制約を変更しますon update cascade

  3. になるように制約を変更しますdeferrable initially deferred

  4. 部屋に適切な id 列を追加し、代わりにそれを参照して、問題を完全に回避します。

于 2013-11-09T09:53:33.600 に答える