gpt4 book ai didi

sql-server - SQL Server 内部级联更新/删除如何工作?

转载 作者:行者123 更新时间:2023-12-03 01:35:20 25 4
gpt4 key购买 nike

好吧,我认为问题没有说清楚。这里我用其他方式重写它。

假设我创建两个表,

  • table1(c1 int PRIMARY KEY)

  • table2(table1c11 int)

table1table2 之间存在关系即table1.c1=table2.table1c11

并且,我在table1table2中执行以下语句

insert into table1(c1)
values('a'),('b'),('c'),('d'),('e')

insert into table2(table1c11)
values('a'),('a'),('b'),('d')

现在我想要实现的是,一旦我更新了table1中的c1的值,table2中的相应数据就会改变自动地。为此,我需要在 table1table2 关系中创建约束并应用 CASCADE UPDATE

因此,稍后我在 table1 中应用新的 SQL 更新语句,即

Update table1 set c1=c1+'updated'

然后table2中的数据也会改变,但是如果我想通过INSTEAD OF UPDATE TRIGGER实现相同的功能,那么我需要编写而不是更新触发器,在其中,我需要使用两个魔法表 INSERTEDDELETED 来处理它。

但要点是,在这种情况下,table1 中只有一列,并且我正在更新同一列,那么我如何映射插入和删除的行。如果我使用 CASCADing,SQL Server 也会做同样的事情。

那么,问题来了,当表中的主键数据发生变化时,SQL Server如何处理批量更新。

最佳答案

So, the question arises how SQL Server handles batch update in case of the primary key data changes in the table.

SQL Server 为更新两个表的更新语句构建查询计划。

创建表:

create table T1
(
T1ID int primary key
);

create table T2
(
T2ID int primary key,
T1ID int references T1(T1ID) on update cascade
)

添加一些数据:

insert into T1 values(1), (2)
insert into T2 values(1, 1), (2, 1), (3, 2)

更新T1的主键:

update T1
set T1.T1ID = 3
where T1.T1ID = 1

更新的查询计划如下所示:

query plan for update with on update cascade

该计划有两个聚集索引更新步骤,一个用于 T1,一个用于 T2

更新1:

当更新多个主键值时,SQL Server 如何跟踪要更新的行?

update T1
set T1.T1ID = T1.T1ID + 100

query plan for update with on update cascade more than one row

Eager Spool在顶部分支(T1 的更新)中,将旧的 T1ID 和新计算的 T1ID (Expr1013) 保存到临时表中,供较低的分支(T2 的更新)。较低分支中的哈希匹配正在将 Table Spool 与旧 T1ID 上的 T2 连接起来。从哈希匹配到 T2 更新的输出是 T2ID,来自 T2 的聚集索引扫描和新计算的 T1ID (Expr1013 ) 来自 Table Spool。

更新2:

如果您需要用而不是触发器替换级联更新,您需要有一种方法来连接插入 已删除 表。这可以通过 T1 中的代理键来完成。

表格:

create table T1
(
T1ID int primary key,
ID int identity unique
);

create table T2
(
T2ID int primary key,
T1ID int references T1(T1ID)
);

触发器可能如下所示。

create trigger tr_T1 on T1 instead of update as

insert into T1(T1ID)
select T1ID
from inserted;

update T2
set T1ID = I.T1ID
from inserted as I
inner join deleted as D
on I.ID = D.ID
where D.T1ID = T2.T1ID;

delete from T1
where T1ID in (
select T1ID
from deleted
);

SQL Fiddle

关于sql-server - SQL Server 内部级联更新/删除如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com