【问题标题】:Stored procedure to delete from 3 tables从 3 个表中删除的存储过程
【发布时间】:2012-10-20 02:51:10
【问题描述】:

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

这是我的桌子:

  • BD_Album(专辑 ID、所有者 ID、专辑名称)
  • 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 表中删除与该相册关联的所有图像。 (警告,删除此相册也会删除其中的所有图片。您确定吗?)

所有者可以创建任意数量的相册。他们还可以通过表单中的列表框将图像分配给多个相册。

可能有点初级,但我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    试试

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

    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)
    

    【讨论】:

    • 我主要利用了这个建议,还有一些来自另一个的sn-ps。谢谢纳拉卡
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      像这样试试。

      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;
      

      【讨论】:

        【解决方案4】:

        您设置表格的方式允许图像在同一个相册中多次存在。如果您只想要专辑中的 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
        

        使用级联,您不需要运行最后一个删除。然后您会说:但是,我不会将图像附加到任何相册吗?是的,你可能会。如果是我,我不喜欢删除相册删除其中的图像,我希望它们保留在某种收件箱中,但是如果您想清除没有 alums 的图像,则可以这样做:

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

        【讨论】:

        • 谢谢 Oxydel。我最小化了表格并将两列作为键。
        【解决方案5】:
        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-05
          • 1970-01-01
          • 2016-11-15
          • 2018-06-09
          • 1970-01-01
          • 2021-09-17
          • 2018-03-01
          相关资源
          最近更新 更多