質問
しています。は、これらのテーブルを持つ関係します。
Table 1
* ID_XPTO (PK)
* Detail
Table 2
* ID_XPTO (FK) (PK)
* ID_XPTO2 (FK) (PK)
二つの関係が存在します。
Table 1 -< Table2
Table 1 -< Table2
私の質問は、必要とすることを削除する一部の列表1のとおりです。私は現在、
declare @table Table (xptoTable2 int)
insert into @table
select ID_XPTO2
from Table2
where ID_XPTO = @ID_XPTO
delete from Table2
where ID_XPTO = @ID_XPTO
delete from Table
where ID_XPTO in (select xptoTable2from @table)
私が使用削除にNULLを設定2.その方が探してみるすべての行はnull値ID_XPTO2して削除し、DBAはないです。
あのシーンをい。
解決
てこれらのオプション:
削除したいびとを確認することができます。削除する表2。
削除からの二つのテーブルを一つ書いる場合、ブランドのデータベースマルチテーブル
DELETE
書式例MySQL).これはスタンダードSQLので便利でした。使用カスケード参照整合性な制約条件(理解していDBAは不採用になるこのオプション)。
書くトトリガ
BEFORE DELETE
上の表1、削除またはセットがNULLの参照を表2.チェックをお伝えがあり許容のカスケードRI。
最後に、私の助言と話をすることDBAと同様の質問だからです。見解は聞い。す。あるStackOverflowお答えできる技術的な質問ですが、音にいるかのような取り扱う IT方針の問題.
他のヒント
ON DELETE CASCADE
使用してください。それはが削除自動的よ。の行を参照します。
なぜあなたは使用しないON DELETE CASCASE
?
DROP TABLE t_f
DROP TABLE t_m
CREATE TABLE t_m (id INT NOT NULL IDENTITY PRIMARY KEY , value VARCHAR(50))
CREATE TABLE t_f (id INT NOT NULL IDENTITY PRIMARY KEY, m INT, CONSTRAINT fk_m FOREIGN KEY (m) REFERENCES t_m(id) ON DELETE CASCADE)
INSERT INTO t_m (value) VALUES ('test')
INSERT INTO t_f (m) VALUES (1)
DELETE FROM t_m
SELECT * FROM t_m
SELECT * FROM t_f
id value
------------ ------
0 rows selected
id m
------------ ------
0 rows selected
法ん:
きるカスケードの削除
書SQL後もie:
DECLARE @DetailCriteria ... SET @DetailCriteria = '....' BEGIN TRAN -- First clear the Table2 of any child records DELETE FROM Table2 WHERE ID_XPTO IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria) OR ID_XPTO2 IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria) -- Next clear Table2 (which will delete fine because you've followed the referential chain) DELETE FROM Table1 WHERE Detail = @DetailCriteria -- commit if you're happy (should check @@ERROR first) COMMIT
所属していません StackOverflow