从3个表中删除的存储过程

时间:2012-10-20 02:51:10

标签: sql sql-server-2008 stored-procedures

我正在创建一个专辑和图片库作为目录的功能。基本上,企业可以创建相册,并将图像添加到这些相册中。

以下是我的表格:

  • BD_Album(AlbumID,OwnerID,AlbumName)
  • BD_Image(ImageID,OwnerID,ImageFile,ImageTitle,ImageDescription,Active)
  • BD_AlbumImage(EntryID,AlbumID,ImageID)

我想创建一个在所有者删除相册时执行的存储过程。我这个程序的目标是清理表格。

DELETE FROM BD_Album WHERE AlbumID = @AlbumID --This is the obvious
DELETE FROM BD_Image WHERE ...
DELETE FROM BD_AlbumImage WHERE AlbumID = @AlbumID

我的困惑在于我还希望从BD_Image表中删除与该相册相关联的所有图像。 (警告,删除此相册也会删除其中的所有图像。你确定吗?)

所有者可以根据自己的喜好创建尽可能多的相册。他们还可以通过表单中的列表框将图像分配给多个相册。

可能有点基本,但任何帮助都会受到赞赏。

5 个答案:

答案 0 :(得分:0)

尝试

DELETE FROM BD_Image 
WHERE ImageID IN 
    (SELECT ImageID FROM BD_AlbumImage WHERE AlbumID = @AlbumID
        AND ImageID  NOT IN 
            (SELECT ImageID FROM BD_AlbumImage WHERE AlbumID <> @AlbumID))

OR

DELETE FROM BD_Image 
WHERE ImageID IN 
    (SELECT ImageID FROM BD_AlbumImage WHERE AlbumID = @AlbumID)
AND ImageID  NOT IN 
    (SELECT ImageID FROM BD_AlbumImage WHERE AlbumID <> @AlbumID)

答案 1 :(得分:0)

您可以从SQL Server中的BD_IMAGE中删除相关记录,如下所示:

DELETE BD_IMAGE
FROM 
    BD_IMAGE i
    JOIN BD_AlbumImage ai
    ON i.ImageID = ai.ImageID
WHERE
    ai.AlbumID = @AlbumID

答案 2 :(得分:0)

试试这样。

delete from BD_Album a,BD_Image i,BD_AlbumImage ai where a.AlbumID = @AlbumID
and ai.AlbumID =a.AlbumID and i.ImageID=ai.ImageID;

答案 3 :(得分:0)

您设置表格的方式允许图像在同一个相册中多次存在。如果您只想在相册中输入1个图像,则BD_AlbumImage表中不需要EntryId列,您可以只使用AlbumId和ImageId,这两个外键都可以构成该表的PrimaryKey。很酷的是,你可以在它上面添加一个级联删除来自动删除这样的记录:

ALTER TABLE BD_AlbumImage 
WITH CHECK ADD  CONSTRAINT FK_BD_AlbumImage_BD_Album 
FOREIGN KEY(AlbumID) REFERENCES BD_Album (AlbumID) ON DELETE CASCADE

使用级联你不需要运行最后一个Delete.And然后你会说:但是,嘿我有没有相册的图像?是的,你可能。如果是我,我不会喜欢删除一个专辑删除其中的图像,我希望它们保留在某种收件箱中,但是如果你想清除没有任何标记的图像,你可以这样做:

DELETE FROM BD_Image 
  LEFT JOIN BD_AlbumImage ON BD_Image.ImageID = BD_AlbumImage.ImageID 
      WHERE BD_AlbumImage.AlbumID IS NULL

答案 4 :(得分:0)

delete from BD_Image where ImageID in(select ImageID from BD_AlbumImage where AlbumID=@AlbumID )
delete from BD_AlbumImage  where AlbumID=@AlbumID
delete from BD_Album where AlbumID=@AlbumID