2011-09-27 8 views
5

制約を使用して列を更新しないSQL更新ステートメントで外部キー制約がチェックされますか? FK制約は、それは、ルックアップだ/でご確認くださいます私はちょうど制約を使用して列を更新しないSQL更新ステートメントで外部キー制約がチェックされますか?

update [dbo].[OrderItems] 
set [ItemName] = 'Product 3' 
where [OrderItemID] = 2508 

を更新した場合

OrderItems 

    - OrderItemID 
    - OrderItemTypeID (FK to a OrderItemTypeID column on another table called OrderItemTypes) 
    - ItemName 

:(MS SQL Serverでは)

は、私は次の列を持つテーブルのカップルを持っていると言います上記の更新文? (たとえ更新によってその列の値が変更されないとしても)

+0

有効な質問ですが、どのように関連性があるのでしょうか –

+0

FKがチェックされていない場合は、更新ステートメントにFK列を含めないことが前提です。 –

答えて

8

いいえ、外部キーはチェックされません。これは、2つの異なる更新プログラムの実行計画を調べることでかなり簡単に確認できます。

create table a (
    id int primary key 
) 

create table b (
    id int, 
    fkid int 
) 

alter table b add foreign key (fkid) references a(id) 

insert into a values (1) 
insert into a values (2) 

insert into b values (5,1) -- Seek on table a's PK 

enter image description here

update b set id = 6 where id = 5 -- No seek on table a's PK 

enter image description here

update b set fkid = 2 where id = 6 -- Seek on table a's PK 

enter image description here

drop table b 
drop table a 
+1

+1素晴らしい例。 –

3

いいえSQLの更新で制約が含まれている列が更新されないため、SQL Serverはこの場合どのようなチェックを行いますか?これは、「更新のみを実行すると、挿入トリガーが起動するのですか?」という質問に似ています。答えはノーです。

+0

あなたはこれを確かに知っていますか、それとも直感ですか?アップデート時にチェックが行われた場合、私には驚かないでしょう。 – JNK

+0

@JNK - 何をチェックするのですか?列が更新されておらず、チェックする値がありません。では、何が確認されるのですか? –

+0

+1シンプルなテストが正しいことを示しています。 FK列を更新する実行計画と実行しない実行計画を調べることで確認できます。 –

1

FKが存在しない場合は、他の列への更新を防ぐことができますがありますたとえFKが変更されていなくても、それはFKがNOCHECKで作成され、作成時にチェックされていないときです。書籍ごとオンライン:

新しいCHECKまたはFOREIGN KEY制約 を既存のデータと照合しない場合は、WITH NOCHECKを使用します。ごくまれにを除き、 を行うことはお勧めしません。新しい制約は、後ですべてのデータ更新が行われる で評価されます。制約が追加されたときにWITH NOCHECKによって抑制された制約違反は、 制約に準拠していないデータで行を更新すると、将来の更新を引き起こす可能性があります( )。

関連する問題