質問

しています。は、これらのテーブルを持つ関係します。

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

法ん:

  1. きるカスケードの削除

  2. 書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
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top