私は2つのテーブルを持っています。彼らは外来のキー関係を持っています。しかし、外部キーはカスケードを更新するように設定されていません。今、テーブルの主キーを更新したいと思います。 SQL ServerはFKのために私がそれをやり遂げるのを常に防ぎます。どのように私はSQLコマンドでそれを行うことができますか?私はFKを変更する権利がありません。外部キーがカスケードに設定されていない2つのテーブルをカスケード更新する方法はありますか?
ありがとうございました。
私は2つのテーブルを持っています。彼らは外来のキー関係を持っています。しかし、外部キーはカスケードを更新するように設定されていません。今、テーブルの主キーを更新したいと思います。 SQL ServerはFKのために私がそれをやり遂げるのを常に防ぎます。どのように私はSQLコマンドでそれを行うことができますか?私はFKを変更する権利がありません。外部キーがカスケードに設定されていない2つのテーブルをカスケード更新する方法はありますか?
ありがとうございました。
なぜこれをやりたいですか?それは潜在的に危険なものとして私を襲う。 あなたのSQLは関連するテーブルを最初に更新し、PKテーブルへのリンクをNULLに戻し、実行されたレコードのIDを格納する必要があります。次に、PKテーブルのPKを更新することができます。その後、関連するテーブルのFKを更新して更新します。
既存の行の属性値に基づいて新しい行を作成しますが、新しいキー値を使用します。参照するすべてのテーブルに対して同じ操作を行います。次に、新しい古いキー値を使用して、参照先の表から行を削除してから、参照先の表を削除します。ような何か:
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';
あなたが唯一の落とし穴のために今
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.)新しい親レコードを作成するとき、または子レコードを更新するときに、意図しない副作用を引き起こすトリガーがいずれのテーブルにもないことを確認します。
FKを変更したり、FKを無効にしてから再度有効にしたり、更新を実行したりする必要はありません。 SQL Serverに遅延制約チェックのオプションはありません –