gpt4 book ai didi

如果行不受约束影响,则 SQL 删除

转载 作者:行者123 更新时间:2023-12-03 21:53:56 25 4
gpt4 key购买 nike

首先请注意,我已经看到了这个问题:TSQL delete with an inner join

我有一个大表和几个外键关系,每个外键关系都有给定年龄的数据。我们需要定期删除比给定数据更旧的数据,以阻止数据库无限制地增长。

我正在编写一个查询,如果您愿意,将根据给定的参数从星上的每个点删除(不幸的是,这些是可配置的,并且在表之间有所不同)。

在第一次删除之后,我有一个中央表,我担心我正在做两次尝试删除的工作,因为在删除数据库时会检查条件。我有一组:

AND NOT EXISTS
(SELECT key
FROM table
WHERE table.key = centretable.key)

哪个 TSQL 正在制作一个正确的反半连接并在索引上做得很好。问题是它创建了一个要删除的内容列表,然后在执行删除时再次执行相同的检查。

我想我的问题是是否有尝试按行删除,(我不会在游标中这样做,因为我知道它会有多慢),但是您会认为这样的关键字会存在,我没有不过,我很幸运地找到了它。

最佳答案

对于仅检查一次关系的单个命令(而不是您的示例中的两次 - 一次用于 NOT EXISTS ,一次用于 DELETE ),那么我希望答案是一个很大的不,对不起。

(离墙想法):
如果这是一个主要问题,您可以尝试某种引用计数实现,使用触发器来更新计数器 - 但实际上我预计这将比简单地检查您已经检查的键要多得多。

您也可以调查 NOCHECK在删除期间(因为您是自己检查的);但是您只能在表级别执行此操作(因此对于管理脚本可能没问题,但对于生产代码则不行)-即:

-- disable
alter table ChildTableName nocheck constraint ForeignKeyName

-- enable
alter table ChildTableName check constraint ForeignKeyName

快速测试表明,启用它后,它会对外键进行额外的聚集索引扫描;禁用它时,它被省略。

这是一个完整的例子;可以看一下两者的查询计划 DELETE操作...(最好与其余代码隔离):
create table parent (id int  primary key)
create table child (id int primary key, pid int)
alter table child add constraint fk_parent foreign key (pid)
references parent (id)

insert parent values (1)
insert parent values (2)
insert child values (1,1)
insert child values (2,1)

-- ******************* THIS ONE CHECKS THE FOREIGN KEY
delete from parent
where not exists (select 1 from child where pid = parent.id)

-- reset
delete from child
delete from parent
insert parent values (1)
insert parent values (2)
insert child values (1,1)
insert child values (2,1)

-- re-run with check disabled
alter table child nocheck constraint fk_parent

-- ******************* THIS ONE DOESN'T CHECK THE FOREIGN KEY
delete from parent
where not exists (select 1 from child where pid = parent.id)

-- re-enable
alter table child check constraint fk_parent

再次 - 我强调这应该只从管理脚本之类的东西中运行。

关于如果行不受约束影响,则 SQL 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057062/

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