2011-02-23 1 views
1

私は2つのテーブルを持っています。彼らは外来のキー関係を持っています。しかし、外部キーはカスケードを更新するように設定されていません。今、テーブルの主キーを更新したいと思います。 SQL ServerはFKのために私がそれをやり遂げるのを常に防ぎます。どのように私はSQLコマンドでそれを行うことができますか?私はFKを変更する権利がありません。外部キーがカスケードに設定されていない2つのテーブルをカスケード更新する方法はありますか?

ありがとうございました。

+0

FKを変更したり、FKを無効にしてから再度有効にしたり、更新を実行したりする必要はありません。 SQL Serverに遅延制約チェックのオプションはありません –

答えて

0

なぜこれをやりたいですか?それは潜在的に危険なものとして私を襲う。 あなたのSQLは関連するテーブルを最初に更新し、PKテーブルへのリンクをNULLに戻し、実行されたレコードのIDを格納する必要があります。次に、PKテーブルのPKを更新することができます。その後、関連するテーブルのFKを更新して更新します。

0

既存の行の属性値に基づいて新しい行を作成しますが、新しいキー値を使用します。参照するすべてのテーブルに対して同じ操作を行います。次に、新しい古いキー値を使用して、参照先の表から行を削除してから、参照先の表を削除します。ような何か:

INSERT INTO Table1 (key_col, attrib_col1) 
    SELECT 'new_key_value', attrib_col1 
    FROM Table1 
    WHERE key_col = 'old_key_value'; 

INSERT INTO Table2 (key_col, attrib_col2) 
    SELECT 'new_key_value', attrib_col2 
    FROM Table2 
    WHERE key_col = 'old_key_value'; 

DELETE 
    FROM Table2 
WHERE key_col = 'old_key_value'; 

DELETE 
    FROM Table1 
WHERE key_col = 'old_key_value'; 
0

あなたが唯一の落とし穴のために今

INSERT INTO ParentTable (PKColumn, attribute1, attribute2) 
    SELECT 'NewPKValue', attribute1, attribute2 
    FROM ParentTable 
    WHERE PKColumn = 'OldPKValue' 
; 


UPDATE ChildTable 
SET FKColumn = 'NewPKValue' 
WHERE FKColumn = 'OldPKValue' 
; 


DELETE 
FROM ParentTable 
WHERE PKColumn = 'OldPKValue' 
; 

...親テーブルに新しい行を挿入し、事後に子行を更新する必要がある必要があります。

1 )上記のコードは、親テーブルの非PK列に定義された一意のインデックスがあり、現在のレコードの非PKデータ値を変更せずに使用する必要がある場合に機能しません。

2.)あなたはこの質問をしているので、あなたの親テーブルがPKとしてIDENTITYカラムを使用していないと仮定しています。

3)コードは確かに効率的ではありません。あなたのデータベースがこれを少数の行で頻繁に行わなければならないなら、あなたはうまくいくはずです。これを毎秒80回行う必要がある場合は、プログラマ/ DBAまたはベンダーに、利用可能な場合は、ON UPDATE CASCADEを含むようにFK定義を更新することについて強くお勧めします。

4.)新しい親レコードを作成するとき、または子レコードを更新するときに、意図しない副作用を引き起こすトリガーがいずれのテーブルにもないことを確認します。