Sql server 删除超过2个月的行,并向下级联到3个表

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 )

我在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.[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());