2

ROUTE_DETAILSROUTE_NUMBERと。を持つテーブルが1つありますROUTE_NAME

CUSTOMER_DETAILS列、、、CUST_CODECUST_NAME持つ別のテーブルがありますROUTE_NUMBER。ここで、ルート番号はの外部キーですROUTE_DETAILS

ROUTE_DETAILS親テーブルであり、CUSTOMER_DETAILS子テーブルです。

のデータROUTE_DETAILS

ROUTE_NUMBER ROUTE_NAME
RN0001 ROUTE1
RN0002 ROUTE2
RN ROUTE3

のデータCUSTOMER_DETAILS

CUST_CODE CUST_NAME ROUTE_NUMBER
CC0001 CUSTOMER1 RN0001
CC0002 CUSTOMER2 RN

ここで問題となるのは、エラーから更新しようとしたとき、またはエラーROUTE_NUMBERから更新しようとしたときです。整合性制約違反の子レコードが見つかりましたROUTE_DETAILSROUTE_NUMBERCUSTOMER_DETAILS

クエリは次のとおりです。

update ROUTE_DETAILS 
   set ROUTE_NUMBER = 'RN0003' 
 where ROUTE_NUMBER = 'RN'

customer_detailsを更新しようとすると同じことが起こります。

4

4 に答える 4

3

私が見る唯一のオプションは、FK 制約を「DEFERRABLE」に変更することです。

次に、データをコミットするときに制約がチェックされるため、単一のトランザクションで両方の行を変更できます。

update ROUTE_DETAILS set ROUTE_NUMBER ='RN0003' where ROUTE_NUMBER ='RN';
update CUSTOMER_DETAILS set ROUTE_NUMBER ='RN0003' where ROUTE_NUMBER ='RN';
commit;

FK 制約の変更方法の詳細については、マニュアルを参照してください。

制約を「INITIALLY IMMEDIATE」に設定した場合set constraints deferred、更新を実行する前に実行する必要があります。

編集、ここに完全な例があります:

テーブルと制約のセットアップ:

create table route_details
(
 route_number varchar(20) not null primary key
);

create table customer_details
(
   cust_code varchar(20) not null primary key,
   route_number varchar(20) not null
);

alter table customer_details
  add constraint fk_route_number 
     foreign key (route_number)
     references route_details (route_number)
  deferrable
  initially immediate;


insert into route_details (route_number)
values ('RN0001');

insert into route_details (route_number)
values ('RN');

insert into customer_details (cust_code, route_number)
values ('CC0001', 'RN0001');

insert into customer_details (cust_code, route_number)
values ('CC0002', 'RN');

commit;

更新を実行します。

set constraints all deferred;

update ROUTE_DETAILS set ROUTE_NUMBER ='RN0003' where ROUTE_NUMBER ='RN';
update CUSTOMER_DETAILS set ROUTE_NUMBER ='RN0003' where ROUTE_NUMBER ='RN';
commit;
于 2012-08-02T08:32:02.823 に答える
1

はい、子がそのキー値を参照している場合、親の主キーを更新することはできません。

また、親テーブルの主キー値を参照しない外部キー値を持つように子を更新することはできません。

したがって、次のいずれかを実行できます。

1)変更を行っている間は一時的に制約を緩和し、後で必ず再適用してください。

または

2) 子行を削除し、親行を更新してから、新しい外部キー値で子を再挿入します。

于 2012-08-02T08:31:49.803 に答える
1

これについて2つの考え...

まず、主キーの値を変更するべきではありません。主キーの要点は、変更されないということです。

ただし、この変更を行う必要がある場合、私が知っている方法は 2 つあります。

  1. route_details に新しい行として「RN0003」を挿入します。次に、影響を受けるすべての顧客を更新します。次に、RN 行を削除します。そう:

    route_number 値に挿入します ('RN0003','ROUTE3');

    update customer_details set route_number = 'RN0003' where route_number = 'RN';

    route_number = 'RN' の route_details から削除します。

  2. ここで説明されているように、遅延キーを使用します。

http://www.orafaq.com/wiki/Foreign_key

于 2012-08-02T08:36:19.233 に答える
0

参照アクションには、 が含まれON UPDATEます。

*CASCADE: 親テーブルから行を削除または更新し、子テーブルの一致する行を自動的に削除または更新します。ON DELETE CASCADEとの両方ON UPDATE CASCADEがサポートされています。

したがって、 foreing keyON UPDATE CASCADEで参照アクションを使用できます。

alter table customer_details
  add constraint fk_route_number 
     foreign key (route_number)
     references route_details (route_number)
     ON UPDATE CASCADE;

NDB テーブルの場合、ON UPDATE CASCADEはサポートされていません。

于 2021-08-27T00:00:51.763 に答える