2009-03-19 2 views
1

2つのテーブルがあります。これらのテーブルには2つの関係があります。2つのテーブルから行を削除する

Table 1 
    * ID_XPTO (PK) 
    * Detail 

Table 2 
    * ID_XPTO (FK) (PK) 
    * ID_XPTO2 (FK) (PK) 

これら2つの関係が存在します。

Table 1 -< Table2 
Table 1 -< Table2 

私の質問は、私が現在やっている表1のいくつかの行を削除する必要があることを私はtable2の上DELETE SET NULLの上で使用することができることを知っている

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) 

です。そうすれば、ID_XPTO2にヌル値を持つすべての行を検索して削除できますが、DBAはそれを使用したくありません。

このプロセスを実行するには、より良い解決策がありますか?

答えて

2

次のオプションがあります。

  • あなたが今行っているように、2つのステートメントで削除してください。最初にTable2から削除してください。

  • ご使用のデータベースのブランドがマルチテーブルDELETE構文(MySQLなど)をサポートしている場合は、1つのステートメントで2つのテーブルから削除してください。これは標準SQLではありませんが、便利です。

  • カスケード参照整合性制約を使用してください(私はあなたのDBAがこのオプションを否定していると思います)。

  • 表2のNULLを削除またはNULLに設定するには、表1にトリガーBEFORE DELETEを書き込んでください。これがカスケーディングするRI制約よりも許容されているかどうかをDBAに確認してください。

最後に、あなたのDBAに相談し、ここで質問したのと同じ質問をすることをお勧めします。彼/彼女があなたが好む解決策を見つけてください。 StackOverflowのメンバーは技術的な質問に答えることができますが、のITポリシーに関する質問を扱っているようです。

2

ON DELETE CASCADEを使用してください。それは自動的に行を参照して削除します。

+0

DBAはそれを使用しないためです。私はなぜか分からない:S – rpf

+0

DBAはSET NULLを望まないと言った。私は彼がこれを許可するかもしれないと思った:) SET NULLはとにかく行く最善の方法ではありません。 –

0

なぜ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 
+0

DBAはそれを使用しないためです。私はなぜか分からない:S – rpf

0

2つの方法が私がの知っている:あなたは自分自身後にクリーンアップするためにあなたのSQLを書くDELETE CASCADE

  • 上で使用することができ

    1. すなわち:

      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 
      
  • 関連する問題