2012-10-20 24 views
0

我正在创建一个相册和图像库作为目录的功能。基本上,企业可以创建相册,并将图像添加到这些相册中。从3个表中删除的存储过程

这里是我的表:

  • BD_Album(ALBUMID,OWNERID,ALBUMNAME)
  • BD_Image(图像标识,OWNERID,镜像文件,ImageTitle,ImageDescription,活动)
  • BD_AlbumImage(的EntryID,ALBUMID,图像标识)

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

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表中删除任何图像。 (警告,删除此相册也会删除其中的所有图片,您确定吗?)

业主可以根据需要创建尽可能多的相册。他们还可以通过表单中的列表框将图像分配给多个相册。

可能有点基本,但任何帮助,将不胜感激。

回答

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

我能主要利用这个建议,从另一个几个片断。谢谢Nalaka – user1447679

0

您可以从BD_IMAGE在SQL服务器中删除相关记录如下:

DELETE BD_IMAGE 
FROM 
    BD_IMAGE i 
    JOIN BD_AlbumImage ai 
    ON i.ImageID = ai.ImageID 
WHERE 
    ai.AlbumID = @AlbumID 
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; 
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 
+0

谢谢Oxydel。我最小化了表格并将两列作为关键字。 – user1447679