1

私は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 の一部の行を削除する必要があるということです。現在行っているのは、

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)

table2 で ON DELETE SET NULL を使用できることはわかっています。そうすれば、ID_XPTO2 で null 値を持つすべての行を検索して削除できますが、DBA はそれを使用したくありません。

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

4

4 に答える 4

2

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

  • 現在行っているように、2 つのステートメントで削除します。最初に Table2 から削除します。

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

  • カスケード参照整合性制約を使用します (DBA がこのオプションを廃止したことは承知しています)。

  • Table1 にトリガーBEFORE DELETEを書き込み、Table2 の参照を削除または NULL に設定します。これがカスケード RI 制約よりも許容できるかどうかを DBA に確認してください。

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

于 2009-03-19T17:50:39.100 に答える
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
于 2009-03-19T17:33:27.893 に答える