質問

したい場合はすべて削除するときのテーブルのデータベースのようにこれまでの外部キー制約が?ない場合は、どうやって切るのです。

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]
役に立ちましたか?

解決

それを参照する外部キーが実際に存在する場合いいえ、これはあなたのテーブルをドロップしません。

(あなたは、SQL Server 2005とアップにしている場合)あなたのテーブルを参照するすべての外部キー関係を取得するには、あなたがこのSQLを使用することができます:

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

と任意のがありますが、ここではこの文で、あなたが実際にそれらのFK関係をドロップするSQL文を作成することができる場合:

SELECT 
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) + 
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

他のヒント

SQL Server Management Studio2008(R2)新きを右クリックし

DB->業務->の生成スクリプト

  • 選択を表したい。

  • に保存"を選択します新しいクエリウィンドウ".

  • クリックし、先端のボタンを押します。

  • セットスクリプトを落とをスクリプトは下がる。

  • セットスクリプトに外部キーがあります。

  • [OK]ボタンをクリックします。

  • 次へ(Next)をクリックし->次>仕上がりです。

  • ビューのスクリプトおよびそれを実行することを示しています。

あなたが最初の「子」の表をドロップする場合は、

、外部キーも同様に削除されます。あなたが最初の「親」の表を削除しようとすると、「それはFOREIGN KEY制約によって参照されているので、オブジェクト 『』を削除できませんでした。」でしょうエラーます。

ここでsp_MSdropconstraintsの手順を使用して、正確にすべてのテーブルをドロップする別の方法があります。私は考えることができ、最短コード:

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";

これはSQL Serverのある場合は、テーブルを削除する前に、制約をドロップする必要があります。

掲載@mark_s何の少しより多くのジェネリックバージョンは、これは私を助けた。

SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) + 
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

ちょうどあなたのテーブル名を差し込み、その結果を実行します。

ここでは、すべての制約が単一の出力行に複数の入力行をマージすることができますFOR XML PATH('')を含む連結トリックを使用して、テーブル自身が続く、削除を行うための別の方法です。何のSQL 2005&以降で動作するはずです。

私は安全のためコメントアウトEXECUTEコマンドを残してきています。

DECLARE @SQL NVARCHAR(max)
;WITH fkeys AS (
    SELECT quotename(s.name) + '.' + quotename(o.name) tablename, quotename(fk.name) constraintname 
    FROM sys.foreign_keys fk
    JOIN sys.objects o ON fk.parent_object_id = o.object_id
    JOIN sys.schemas s ON o.schema_id = s.schema_id
)
SELECT @SQL = STUFF((SELECT '; ALTER TABLE ' + tablename + ' DROP CONSTRAINT ' + constraintname
FROM fkeys
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

SELECT @SQL = STUFF((SELECT '; DROP TABLE ' + quotename(TABLE_SCHEMA) + '.' + quotename(TABLE_NAME) 
FROM INFORMATION_SCHEMA.TABLES 
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

ここでソリューションを実装するための完全なスクリプトがあります:

create Procedure [dev].DeleteTablesFromSchema
(
    @schemaName varchar(500)
)
As 
begin
    declare @constraintSchemaName nvarchar(128), @constraintTableName nvarchar(128),  @constraintName nvarchar(128)
    declare @sql nvarchar(max)
    -- delete FK first
    declare cur1 cursor for
    select distinct 
    CASE WHEN t2.[object_id] is NOT NULL  THEN  s2.name ELSE s.name END as SchemaName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  t2.name ELSE t.name END as TableName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  OBJECT_NAME(d2.constraint_object_id) ELSE OBJECT_NAME(d.constraint_object_id) END as ConstraintName
    from sys.objects t 
        inner join sys.schemas s 
            on t.[schema_id] = s.[schema_id]
        left join sys.foreign_key_columns d 
            on  d.parent_object_id = t.[object_id]
        left join sys.foreign_key_columns d2 
            on  d2.referenced_object_id = t.[object_id]
        inner join sys.objects t2 
            on  d2.parent_object_id = t2.[object_id]
        inner join sys.schemas s2 
            on  t2.[schema_id] = s2.[schema_id]
    WHERE t.[type]='U' 
        AND t2.[type]='U'
        AND t.is_ms_shipped = 0 
        AND t2.is_ms_shipped = 0 
        AND s.Name=@schemaName
    open cur1
    fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    while @@fetch_status = 0
    BEGIN
        set @sql ='ALTER TABLE ' + @constraintSchemaName + '.' + @constraintTableName+' DROP CONSTRAINT '+@constraintName+';'
        exec(@sql)
        fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    END
    close cur1
    deallocate cur1

    DECLARE @tableName nvarchar(128)
    declare cur2 cursor for
    select s.Name, p.Name
    from sys.objects p
        INNER JOIN sys.schemas s ON p.[schema_id] = s.[schema_id]
    WHERE p.[type]='U' and is_ms_shipped = 0 
    AND s.Name=@schemaName
    ORDER BY s.Name, p.Name
    open cur2

    fetch next from cur2 into @schemaName,@tableName
    while @@fetch_status = 0
    begin
        set @sql ='DROP TABLE ' + @schemaName + '.' + @tableName
        exec(@sql)
        fetch next from cur2 into @schemaName,@tableName
    end

    close cur2
    deallocate cur2

end
go
Removing Referenced FOREIGN KEY Constraints
Assuming there is a parent and child table Relationship in SQL Server:

--First find the name of the Foreign Key Constraint:
  SELECT * 
  FROM sys.foreign_keys
  WHERE referenced_object_id = object_id('States')

--Then Find foreign keys referencing to dbo.Parent(States) table:
   SELECT name AS 'Foreign Key Constraint Name', 
           OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) AS 'Child Table'
   FROM sys.foreign_keys 
   WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
              OBJECT_NAME(referenced_object_id) = 'dbo.State'

 -- Drop the foreign key constraint by its name 
   ALTER TABLE dbo.cities DROP CONSTRAINT FK__cities__state__6442E2C9;

 -- You can also use the following T-SQL script to automatically find 
 --and drop all foreign key constraints referencing to the specified parent 
 -- table:

 BEGIN

DECLARE @stmt VARCHAR(300);

-- Cursor to generate ALTER TABLE DROP CONSTRAINT statements  
 DECLARE cur CURSOR FOR
 SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + 
 OBJECT_NAME(parent_object_id) +
                ' DROP CONSTRAINT ' + name
 FROM sys.foreign_keys 
 WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
            OBJECT_NAME(referenced_object_id) = 'states';

 OPEN cur;
 FETCH cur INTO @stmt;

 -- Drop each found foreign key constraint 
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@stmt);
    FETCH cur INTO @stmt;
  END

  CLOSE cur;
  DEALLOCATE cur;

  END
  GO

--Now you can drop the parent table:

 DROP TABLE states;
--# Command(s) completed successfully.

あなたはUIからの外部キー制約をドロップすることができますSQL Server Managerを使用して。あなたは、テーブルDiaryなく、ユーザーテーブルを削除したい場合はDiaryIdテーブルを指す外部キーDiaryを持っている、あなたは(プラス記号を使用して)Userテーブルを展開し、[Foreign Keysセクションを展開することができます。右日記テーブルへのポイントは、その後Deleteを選択することを外部キーをクリックしてください。あなたは、その後、Columnsセクションを展開し、右クリックして、あまりにも列DiaryIdを削除することができます。次に、あなただけ実行することができます:

drop table Diary
<時間>

私はあなたの実際の質問はすべてのテーブルを削除することについて知っているので、これはそのような場合に便利ではないかもしれません。しかし、あなただけのいくつかのテーブルを削除したい場合は、これは便利です、私は(タイトルは、明示的にすべてのテーブルを削除言及していない)と考えています。

あなたがMySQLサーバ上にあり、あなたがあなたのテーブルを失う気にしない場合は、一度に複数のテーブルを削除するには、単純なクエリを使用することができた場合:

SET foreign_key_checks = 0;
DROP TABLE IF EXISTS table_a,table_b,table_c,table_etc;
SET foreign_key_checks = 1;
それはあなたがあなたのクエリにテーブルを使用し注文するものでは問題ではない。このように、

誰もがあなたが多くのテーブルを持つデータベースを持っている場合、これは良い解決策ではないという事実について何かを言おうとした場合:!私は同意する

  私はすべてのテーブルを削除したい場合は、

  私のデータベース

はその後、それは、データベース全体を削除するにははるかに簡単です

DROP DATABASE WorkerPensions

は、外部キーの使用を使用して他のテーブルで参照されたテーブルをDROPしたい場合

DROP TABLE *table_name* CASCADE CONSTRAINTS;
私はそれがあなたのために働くべきだと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top