是否在不使用约束更新列的SQL更新语句上检查外键约束?

Joh*_*ert 5 sql-server performance foreign-keys

是否在不使用约束更新列的SQL更新语句上检查外键约束?(在MS SQL Server中)

假设我有几个包含以下列的表:

OrderItems

    - OrderItemID
    - OrderItemTypeID (FK to a OrderItemTypeID column on another table called OrderItemTypes) 
    - ItemName
Run Code Online (Sandbox Code Playgroud)

如果我只是更新

update [dbo].[OrderItems]
set    [ItemName] = 'Product 3'
where  [OrderItemID] = 2508 
Run Code Online (Sandbox Code Playgroud)

FK约束是否会使用上面的update语句进行查找/检查?(甚至认为更新不会更改该列的值?)

Joe*_*lli 8

不,不检查外键.通过检查两个不同更新的执行计划,很容易看出这一点.

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

update b set id = 6 where id = 5 -- No seek on table a's PK
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

update b set fkid = 2 where id = 6 -- Seek on table a's PK
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

drop table b
drop table a
Run Code Online (Sandbox Code Playgroud)