Sql server 删除超过2个月的行,并向下级联到3个表
我在SQL Server 2014数据库上有以下SQL方案:Sql server 删除超过2个月的行,并向下级联到3个表,sql-server,tsql,Sql Server,Tsql,我在SQL Server 2014数据库上有以下SQL方案: create table dbo.Media ( Id int identity not null constraint PK_Media_Id primary key clustered (Id), Created datetime not null, ) create table dbo.MediaFile ( MediaId int not null, FileId int not null )
create table dbo.Media (
Id int identity not null
constraint PK_Media_Id primary key clustered (Id),
Created datetime not null,
)
create table dbo.MediaFile (
MediaId int not null,
FileId int not null
)
create table dbo.[File]
(
Id int identity not null
constraint PK_File_Id primary key clustered (Id),
Content varbinary (max) filestream null
constraint DF_File_Content default (0x)
) filestream_on [FILE]
alter table dbo.MediaFile
add constraint FK_MediaFile_MediaId foreign key (MediaId) references [Media](Id) on delete cascade on update cascade,
constraint FK_MediaFile_FileId foreign key (FileId) references [File](Id) on delete cascade on update cascade;
我正在使用以下命令删除超过2个月的所有媒体行:
DELETE
FROM dbo.Media
WHERE Created < GETDATE() - 60
这会删除媒体文件,因为我有删除级联,但不会删除相应的文件
如何删除介质及其介质文件以及介质中超过2个月的行的文件?如果需要更通用的解决方案,请查看。 然而,对于您的情况,这应该可以
DELETE FROM MediaFile WHERE MediaID IN (
SELECT Id FROM Media WHERE Created < dateadd(dd, -60, GetDate())
)
DELETE FROM Media WHERE Created < dateadd(dd, -60, GetDate())
DELETE FROM File WHERE NOT EXISTS (SELECT 1 FROM MediaFile WHERE File.Id = FileId)
这将删除将要删除相关媒体的所有文件,除非这些文件也与不将要删除的媒体相关
delete f
from dbo.[File] as f
inner join dbo.MediaFiles as mf
on mf.FileId = f.FileId
inner join dbo.Media as m
on m.MediaId = mf.MediaId
and m.Created < dateadd(day,-60,getdate())
where not exists (
select 1
from dbo.Media as m
inner join dbo.MediaFiles as mf
on m.MediaId = mf.MediaId
and m.Created > dateadd(day,-60,getdate())
where mf.FileId = f.FileId
);
delete
from dbo.Media
where Created < dateadd(day,-60,getdate());
delete f
from dbo.[File] as f
inner join dbo.MediaFiles as mf
on mf.FileId = f.FileId
inner join dbo.Media as m
on m.MediaId = mf.MediaId
and m.Created < dateadd(day,-60,getdate());
delete
from dbo.Media
where Created < dateadd(day,-60,getdate());
而是使用以下命令:
看起来您正在将两个约束添加到同一个表中。尝试在文件表上添加约束。再次查看时,似乎您正在设置多对多关系。这是一个相关的问题。
delete f
from dbo.[File] as f
where exists (
select 1
from dbo.Media as m
inner join dbo.MediaFiles as mf
on m.MediaId = mf.MediaId
and m.Created < dateadd(day,-60,getdate())
where mf.FileId = f.FileId
);
delete
from dbo.Media
where Created < dateadd(day,-60,getdate());