2017-06-17 7 views
-1

はのは、仮定しましょう:他のテーブルの値を削除せずにプライマリキーを持つテーブル内の行を削除する方法外部キー?

CREATE TABLE Client(
ID_Client int primary key, 
Name varchar(20)); 

CREATE TABLE Sale(
X int primary key, 
ID_Client int REFERENCES Client(ID_Client)); 

INSERT INTO Client VALUES(123456, 'Sam'); 

INSERT INTO Sale VALUES(1, 123456); 

どのように私は、それがFK値だ失うことなく販売を削除せずに「サム」を削除しますか?

+1

「FKの価値を失うことなく」ということを明確にすることはできますか? '1'や' 123456'を保存しようとしていますか? – Mureinik

+0

外部キー制約を削除しますか? – zerkms

+0

あなたの例では、 '削除 'Samはセールを削除せず、それを失うことなくFKの値を意味します。サムの名前を更新するだけです。 –

答えて

0

外部キーはそのままID_ClientClientに含まれていない値をとることを禁止します。したがって、最初にSale -recordを削除したり、それぞれの販売記録のclient_idを別のものに変更したりすることなく、クライアントレコードSamを削除することはできません。

あなたが販売記録を保存したい場合は、DBMSは、任意のスレーブレコードで(削除)マスタレコードへの参照を修正してNULLにスレーブレコードのID_Client - 値を設定するようなID_Client REFERENCES Client(ID_Client) ON DELETE SET NULLを書くことができます。もちろん、(削除された)クライアントレコードのIDが123456であるという情報は失われます。なぜなら、これは「有効な」参照ではなくなり、スレーブレコードでは発生しないからです。

123456の値を保持する場合は、外部キー制約を削除する必要があります。依然としてクライアントと販売に加わることができます。 DBMSは参照整合性を保証しません。これはあなた自身でチェックしなければなりません。

0

外国キーの制約ALTER TABLE Sale DROP CONSTRAINT ...を削除するだけで、その行を削除することができます...しかし、未知のクライアントを参照する販売を行うことができるので、一貫性の問題があります。

0
  1. 外部キー参照を持つことはできず、REFERENCEDテーブルにそのキーを持たせることはできません。 FK参照を削除し、 'Sam'で行を削除することができます。
  2. 制約を保持し、基本的に 'Sam'を持たない場合は、 'Sam'の代わりにNULLを挿入します。 ID_Client REFERENCES Clientによって導入
関連する問題