2014-07-15 81 views
0

我有以下内容:如何删除记录如果我可以先删除其他记录?

一个文件可以包含另一个文件(一个视频文件包含音频和字幕),并且通常不会单独保存内容文件,只会显示为主文件的一部分。然而在一些特殊情况下,我将一些内容文件分开保存。

另外我有商店,所以如果是主文件,并且如果我有一个辅助文件保存在主文件的一部分中,则一个文件在商店中。

所以我有这样的两个表:

  • 文件(IDfile,...);
  • FilesContainsFiles(IDContainerFile,IDContentFile);
  • 百货(IDStore,...)
  • StoresHaveFiles(IDStore,IDFile)

如果我想删除一个主文件,我想只能从特定sotre删除,因此,如果该文件是在其他商店中,我不想删除该文件。如果该文件不在另一个商店中,我想删除该文件,因为它无法在数据库中获得该信息。

此外,我想要删除所有的内容文件,仅当内容文件没有存储在另一个存储单独的主文件之外。

为了确保我无法删除其他商店中的文件,我不会删除StoresHasFiles上的关联级联,因此通过这种方式我得到了一个外国人关键错误。

所以我想按照这个步骤:

  • 尝试删除主文件。如果我可以做到,请尝试删除内容文件。

我想我需要一个事务来做到这一点,但我不知道该怎么做。

我不知道我是否可以声明一个列表,其中包含我尝试删除的文件,如何迭代此列表以及如何尝试删除内容文件,以及如果某些内容文件无法删除因为存储在其他地方,请尝试删除下一个内容文件。

也许有另外的选择来解决这种情况?

谢谢。

回答

2

有几种不同的方法可以做到这一点。关于交易,了解语法和用法的最简单方法是在MSDN上阅读关于Begin Transaction的信息。

对于删除,我会做的方式是:

​​
1

我将与一系列的检查,处理这个问题。

如果该文件存在于指定的商店..否则什么都不做。 如果该文件存在于某个其他商店...则只需从该商店中删除。

例:

IF OBJECT_ID('TEMPDB..#Files') IS NOT NULL DROP TABLE #Files 
IF OBJECT_ID('TEMPDB..#FilesContainsFiles') IS NOT NULL DROP TABLE #FilesContainsFiles 
IF OBJECT_ID('TEMPDB..#Stores') IS NOT NULL DROP TABLE #Stores 
IF OBJECT_ID('TEMPDB..#StoresHaveFiles') IS NOT NULL DROP TABLE #StoresHaveFiles 

CREATE TABLE #Files ([IDFile] INT IDENTITY(1,1), [FileName] VARCHAR(100)) 
CREATE TABLE #FilesContainsFiles ([IDContainerFile] INT, [IDContentFile] INT) 
CREATE TABLE #Stores ([IDStore] INT IDENTITY(1,1), [StoreName] VARCHAR(100)) 
CREATE TABLE #StoresHaveFiles ([IDStore] INT, [IDFile] INT) 

INSERT INTO #Stores (StoreName) VALUES ('Target'),('Walmart') 
INSERT INTO #Files ([FileName]) VALUES ('true.blood.mkv'), ('game.of.thrones.mkv'), ('game.of.thrones-swe.sub') 
INSERT INTO #FilesContainsFiles (IDContainerFile, IDContentFile) VALUES (2,3) 
INSERT INTO #StoresHaveFiles (IDStore, IDFile) VALUES (1,1),(1,2),(2,2) 

DECLARE @StoreToDeleteFrom VARCHAR(100), @FileToDelete VARCHAR(100) 
--SET @StoreToDeleteFrom='Target' 
SET @StoreToDeleteFrom='Walmart' 
--SET @FileToDelete='true.blood.mkv' 
SET @FileToDelete='game.of.thrones.mkv' 

SELECT * 
FROM #Files F 
LEFT OUTER JOIN #FilesContainsFiles FParent ON F.IDFile=FParent.IDContainerFile 
LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 

-- IF THE FILE IS AT OUR STORE... 
IF EXISTS (SELECT * 
      FROM #Files F 
      LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
      LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 
      WHERE [email protected] 
      AND F.[FileName][email protected]) 
BEGIN 
    -- IF THE FILE IS NOT AT ANY OTHER STORE 
    IF NOT EXISTS (SELECT * 
        FROM #Files F 
        LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
        LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 
        WHERE S.StoreName<>@StoreToDeleteFrom 
        AND F.[FileName][email protected]) 
    BEGIN 
     -- GO AHEAD AND DELETE FILE EVERYWHERE... 
     PRINT 'DELETE FILE' 

     DELETE SHF 
     FROM #Stores S 
     JOIN #StoresHaveFiles SHF 
      ON S.IDStore=SHF.IDStore 
      JOIN #Files F 
       ON SHF.IDFile=F.IDFile 
       AND F.[FileName][email protected] 
     WHERE [email protected] 

     DELETE FCF 
     FROM #Files F 
     JOIN #FilesContainsFiles FCF 
      ON F.IDFile=FCF.IDContentFile 
     WHERE F.[FileName][email protected] 

     DELETE FCF 
     FROM #Files F 
     JOIN #FilesContainsFiles FCF 
      ON F.IDFile=FCF.IDContainerFile 
     WHERE F.[FileName][email protected] 

     DELETE F 
     FROM #Files F 
     WHERE [FileName][email protected] 
    END 
    ELSE 
    BEGIN 
     -- ONLY DELETE FROM STORE 
     PRINT 'DELETE FILE FROM STORE ONLY' 

     DELETE SHF 
     FROM #Stores S 
     JOIN #StoresHaveFiles SHF 
      ON S.IDStore=SHF.IDStore 
      JOIN #Files F 
       ON SHF.IDFile=F.IDFile 
       AND F.[FileName][email protected] 
     WHERE [email protected] 
    END 
END 
ELSE 
BEGIN 
    -- ITS NOT AT THAT STORE... 
    PRINT 'NOTHING TO DELETE' 
END 


SELECT * 
FROM #Files F 
LEFT OUTER JOIN #FilesContainsFiles FParent ON F.IDFile=FParent.IDContainerFile 
LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore