【问题标题】:SQL Server: drop table cascade equivalent?SQL Server:删除表级联等效?
【发布时间】:2011-06-19 00:18:17
【问题描述】:

在 oracle 中,要删除所有表和约束,您可以键入类似的内容

DROP TABLE myTable CASCADE CONSTRAINTS PURGE;

这将完全删除表及其依赖项。什么是 SQL 服务器等价物??

【问题讨论】:

标签: sql sql-server cascade database-table sql-drop


【解决方案1】:

我只需要删除外键

DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = 'XXX'


DECLARE db_cursor CURSOR FOR  
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY'

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    select    @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @TABLE_NAME
    exec    sp_executesql @sql 

       FETCH NEXT FROM db_cursor INTO  @TABLE_NAME, @CONSTRAINT_NAME 
END  

CLOSE db_cursor  
DEALLOCATE db_cursor 

【讨论】:

    【解决方案2】:

    在某些表格引用您的表格之前,这一切都很有趣和游戏......

    然后我必须像这样更改提供的代码:

    CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL
    as
    DECLARE @sql nvarchar(255)
    WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
    BEGIN
        select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
        from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        where    constraint_catalog = @database and 
                table_name = @table
        select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME
          from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join
                      INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on
                       (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and
                        rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join
                      INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on
                       (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and
                        tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME)
         where tc.constraint_catalog = @database
           and tc_pk.TABLE_NAME = @table
        exec    sp_executesql @sql
    END
    go
    

    【讨论】:

      【解决方案3】:

      最终我们要删除我们的表格。 所以我们可以简单地运行以下 2 个命令:

      改变表...删除约束...

      删除表 ...

      1> ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE;

      -- 表名和约束名是参数

      2> 删除表。

      第一个删除约束,其名称与表相关联 其次,您可以删除表格。

      它对我有用,也很容易。

      【讨论】:

        【解决方案4】:

        在 SQL Server Management Studio 中,转到选项/SQL Server 对象资源管理器/脚本,并启用“为依赖对象生成脚本”。然后右键单击表格,脚本 > 拖放到 > 新查询窗口,它将为您生成它。

        【讨论】:

        • 也适用于删除数据库中的所有对象。 ssms 强大功能的另一个例子。让我自己从 sys.objects 中编写脚本!!
        • 对于 OP 来说不是很好的解决方案,现在我明白为什么它默认被禁用了。不知何故,所有表都“依赖”于ContactInfo 表......呃......
        【解决方案5】:

        这可能是一个糟糕的解决方案,但我发现它很快。和Vinnie的回答差不多,但是SQL语句的产物是另外一系列的SQL语句,会删除所有的约束和表。

        (
        select
          'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';'
        from
          INFORMATION_SCHEMA.TABLES t
          ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        where
          t.table_name = tc.table_name
          and tc.constraint_name not like '%_pk'
          and tc.constraint_name not like 'pk_%'
          and t.table_catalog='<schema>'
        ) UNION (
        select
          'DROP TABLE ' + t.table_name + ';'
        from
          INFORMATION_SCHEMA.TABLES t
        where
          t.table_catalog='<schema>'
        )
        

        【讨论】:

        • 该查询中的表名在哪里?
        • 表名存储在信息模式表中。谷歌上,我相信你会找到关于它的真实文档。
        • 谢谢,但我的意思是如果我想删除表“mytable”,我应该在where子句中添加and t.table_name = 'mytable'吗?
        • 啊,SO问题是针对所有表格的。如果你想做一张桌子,那么你会想做不同的事情。我假设 drop table 本身不起作用。所以这意味着您对其他表有限制。我建议使用您的问题陈述创建一个新的 SO 问题,以便解决所有问题。
        • 好吧,标题写着 table 但内容写着 tables 所以我的新问题可能会作为重复项关闭 :) 我更喜欢你的解决方案因为它不是scriptlet,所以我会尝试看看如何将它调整到单个表中。
        【解决方案6】:

        我不相信 SQL 有类似优雅的解决方案。您必须先删除所有相关约束,然后才能删除表。

        幸运的是,这一切都存储在信息架构中,您可以访问它来获取您的重击列表。

        这篇博文应该能够为您提供所需的内容: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

        -- t-sql scriptlet to drop all constraints on a table
        DECLARE @database nvarchar(50)
        DECLARE @table nvarchar(50)
        
        set @database = 'DatabaseName'
        set @table = 'TableName'
        
        DECLARE @sql nvarchar(255)
        WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
        BEGIN
            select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
            from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
            where    constraint_catalog = @database and 
                    table_name = @table
            exec    sp_executesql @sql
        END
        

        【讨论】:

          猜你喜欢
          • 2015-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-06
          • 1970-01-01
          相关资源
          最近更新 更多