2017-02-17 4 views
1

までカスケード:削除行と私は、SQL Server 2014データベースで次のSQLのスキームを持っている3つのテーブル

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 

これは私が持っているので、ON DELETE CASCADEをMediaFileがが削除されますが、対応ファイルは削除されません...

私は、rのためにメディア、彼らのMediaFilesと、そのファイルを削除するにはどうすればよいです2か月以上経過しているメディアはなぜですか?

+2

を使用すると、同じテーブルに両方の制約を追加しているように見えます。 Fileテーブルに制約を追加してみてください。 –

+0

[また、このように日付を使用しないでください。代わりにDateAddを使用してください。](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx) –

+0

オンそれはあなたが多対多の関係を設定しているように見えます。関連する質問があります。 http://stackoverflow.com/questions/1379333/how-to-cascade-delete-over-many-to-many-table –

答えて

-1

より一般的な解決策をご希望の場合は、hereをご覧ください。 は、しかし、あなたの場合のために、これは

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) 
0

を行う必要がありますこれは、ない限り、彼らはまた、削除するつもりはないMediaに関連している、関連Mediaを削除しようとしているすべてのFilesを削除します。

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()); 

これはMediaを削除しようとしている関連するすべてのFilesを削除します。

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()); 

代わりexists()を使用して:

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()); 
関連する問題