2011-11-24 21 views
23

別のテーブル(子)との関係を持つSQL Serverテーブル(親)のデータを削除します。
私は基本的な削除クエリを試しました。しかし、それは働いていません(私はそれがないと知っています)。SQL Serverテーブルの外部キーを使用したデータの削除

DELETE FROM table WHERE ... 

それは私がテーブルのスキーマを維持する必要があり

...

REFERENCE制約と競合DELETE文を次のエラーが返されました。私はちょうどクエリにいくつかの単語を追加する必要があることを知っている、私は今までこれをやったことがあるが、私はそれを思い出すことができませんでした。

答えて

12

削除を自動にする場合は、外部キー制約がON DELETE CASCADEになるようにスキーマを変更する必要があります。

詳細については、MSDN page on Cascading Referential Integrity Constraintsを参照してください。

ETA(投稿者からの説明の後):スキーマを更新できない場合は、最初に該当する子レコードを手動で削除する必要があります。

+0

ああ。私は私のポストにその部分を伝えていなかったので、スキーマを変更することなくそれを稼働させる必要があります。それは可能でしょうか? – Andha

+1

いいえ、OPTIONなどの魔法のクエリでは不可能です。手動で削除を実行する必要があります。 –

28

あなたが前と削除した後、外部キー制約を無効にし、再度有効にすることができます

alter table MyOtherTable nocheck constraint all 
delete from MyTable 
alter table MyOtherTable check constraint all 
+5

制約を無効にしてから再び有効にすると、壊れた「外部キー」参照によって再有効化に失敗しませんか? –

+0

いいえ、新しい値をフィールドに書き込むときにのみ制約をチェックします。チェックを入れたときにテーブル全体を再スキャンしません。 –

+3

これは、子テーブル内のすべてのデータがそこに残ることを意味します。私は2k行を削除しようとしています、そして、私は子テーブルにデータを保持する場合、それはかさばるだろうと思います。私はそれを手作業でやろうと思う。とにかく返信の人のためのThx。あなたは+1しなければなりません。 – Andha

2

をだから、あなたはPRIMARY KEY他を参照するためにUPDATEに衝突したテーブルまたは複数の論理からDELETE関連の行に自分のFOREIGN KEY列を必要とします親テーブルからのものです。

また、あなたはあなたが手動で子供を削除する必要があり、この記事Don’t Delete – Just Don’t

26

を読むことをお勧めします。 <condition>は両方のクエリで同じです。 parent_childの関係を持つテーブルからデータを削除するには

DELETE FROM child 
FROM cTable AS child 
INNER JOIN table AS parent ON child.ParentId = parent.ParentId 
WHERE <condition>; 

DELETE FROM parent 
FROM table AS parent 
WHERE <condition>; 
+0

これらの2つの削除は、の部分を1回書くだけの方法で組み合わせることができますか? –

+1

私は@トーマス・テンペルマンとは思えない。条件を一度だけ書きたい場合は、手動で各テーブルを処理するのではなく、カスケード削除をオンにする必要があります。 Alastair Mawの答えは、このオプションも参照しています。 –

2

、 まず、あなたは、単に親テーブルからデータを削除参加言及することにより、子テーブルからデータを削除する必要があり、例を以下に示し:

ここ
DELETE ChildTable 
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID 
WHERE <WHERE CONDITION> 


DELETE ParentTable 
WHERE <WHERE CONDITION> 
+0

カスケード削除しない場合はこれが最良の答えです。カーソルは恐ろしく実行され、削除する制約を削除すると、孤立した行が他のテーブルに残る可能性があります。 – Corv1nus

5

あなたの "子" テーブルの外部キーを追加している

ALTER TABLE child 
ADD FOREIGN KEY (P_Id) 
REFERENCES parent(P_Id) 
ON DELETE CASCADE 
ON UPDATE CASCADE; 
その後

子供がDELETE CASCADEを持つ親への参照を持っているので、あなたがこの

DELETE FROM parent WHERE ..... 

のような「親」テーブルの上にDELETEクエリを作成する場合は、「子」の行にもなります削除される! 「親」と一緒に。

1

データベースのすべてのテーブル内のすべてのデータを削除することができますお役立ちスクリプト、 はあなたdatabse名前でTTを置き換える:

declare @tablename nvarchar(100) 
declare c1 cursor for 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='tt' AND TABLE_TYPE='BASE TABLE' 

open c1 
fetch next from c1 into @tablename 

while @@FETCH_STATUS = 0 
    begin 
    print @t1 
     exec('alter table ' + @tablename + ' nocheck constraint all') 
     exec('delete from ' + @tablename) 
     exec ('alter table ' + @tablename + ' check constraint all') 
     fetch next from c1 into @tablename 
    end 
close c1 
DEALLOCATE c1 
関連する問題