【问题标题】:Delete data from dependent tables从依赖表中删除数据
【发布时间】:2011-04-14 15:01:14
【问题描述】:

SQL Server 2008 中是否有一个查询会同时删除所有相关表中的数据以及所选表?

我很抱歉没有详细说明这个问题。我知道 Cascade Delete 可以正常工作,但我的应用程序连接到第 3 方 SQL Server 数据库。我有一些单元测试插入到目标表和从属表中。不幸的是,目标表上的约束不是 On Delete Cascade,我无法创建它们或创建它们。我正在寻找一种通用的方法来遍历依赖项并以正确的顺序删除数据。

【问题讨论】:

  • 如果你有完整性约束(外键)和级联删除规则,你就不用担心了。 publib.boulder.ibm.com/infocenter/idshelp/v10/topic/…
  • 尽管链接是针对 informix 文档的,但对于 sql server 也是如此。
  • 如果您至少定义了外键(没有级联删除),则可以使用系统表创建动态 SQL,并且实际上执行与级联删除相同的操作。如果没有定义外键,那么为它制定通用解决方案的希望渺茫。
  • @Lieven,是的,与依赖表存在外键关系。您能否详细说明您的建议?

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

从 msdn、书籍、文章中了解ON CASCADE DELETE,您会找到答案。

Cascading Referential Integrity Constraints

【讨论】:

    【解决方案2】:

    为此,您使用级联删除在表之间设置约束。您可以在图表中通过拖动字段之间的连接并编辑属性或使用查询来做到这一点:

     alter table SomeTable
     add constraint SomeConstraint
     foreign key (SomeField) references SomeOtherTable (SomeOtherField) 
     on delete cascade
    

    【讨论】:

      【解决方案3】:

      由于存在外键关系,因此以下脚本可以让您开始模仿级联删除。

      DECLARE @TableName VARCHAR(32)
      DECLARE @PrimaryKey VARCHAR(32)
      
      SET @TableName = 'MasterTable'
      SET @PrimaryKey = '1'
      
      SELECT  'DELETE FROM '
              + fks.name + '.' + fkt.name
              + ' WHERE '
              + pc.name 
              + ' = '
              + @PrimaryKey
              , fko.name as [FK Name]
              , fk.constraint_column_id as [Col Order]
              , fks.name + '.' + fkt.name as [FK table]
              , pc.name as [FK column]
              , rcs.name + '.' + rct.name as [PK table]
              , rc.name as [PK column]
      FROM    sys.foreign_key_columns fk
              -- FK columns
              INNER JOIN sys.columns pc ON fk.parent_object_id = pc.object_id
                                           AND fk.parent_column_id = pc.column_id
              INNER JOIN sys.objects fkt ON pc.object_id = fkt.object_id
              INNER JOIN sys.schemas as fks ON fks.schema_id = fkt.schema_id
              -- referenced PK columns
              INNER JOIN sys.columns rc ON fk.referenced_object_id = rc.object_id
                                           AND fk.referenced_column_id = rc.column_id
              INNER JOIN sys.objects rct ON rc.object_id = rct.object_id
              INNER JOIN sys.schemas as rcs ON rcs.schema_id = rct.schema_id
              -- foreign key constraint name
              INNER JOIN sys.objects fko ON fk.constraint_object_id = fko.object_id
      WHERE   rct.Name = @TableName
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-03
        • 2011-01-02
        • 2019-11-13
        • 2015-06-18
        • 2018-06-18
        • 2011-12-05
        • 2014-03-16
        • 2015-03-07
        相关资源
        最近更新 更多