1

HSQLデータベースに多対多の関係を持つ2つのテーブル(説明のために名前を変更/リファクタリング)があります。多対多の関係の片側から削除するときにすべてを消去したい (テーブルをクエリせずに、これはパフォーマンスが重要です)

ここに私の主なテーブルがあります:

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)

ここに私の結合テーブルがあります:

CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)

ここに私の制約があります:

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

私は基本的にこれをやりたいです:「person_id = 0の人から削除」し、JOBエンティティが孤立する場合はPERSON、JOB_PERSON、およびJOBからすべてを削除します(多対多テーブルで参照されなくなります)

データベースにクエリを実行せずにこれは可能ですか? 削除すると、PERSON と JOB_PERSON からのみ削除されます。おそらくおわかりのように、私の SQL スキルは不足しています。

これが私が遊んでいるダミーデータです:

insert into person values(null,'Arthur');
insert into person values(null,'James');
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

したがって、これらのステートメントの両方を入力すると、次のようになります。

delete from person where person_id=0
delete from person where person_id=1

3 つのテーブルすべてをすべて削除したいと考えています。可能?

4

1 に答える 1

4

IDを渡すストアドプロシージャを作成し、必要な順序で適切な行を削除するだけです。

このように、アプリは正確な順序に関連付けられていません。これは、将来DBの再設計によって変更される可能性があります。また、ストアドプロシージャは、大量のクエリを送信するよりも高速であるという追加のボーナスも得られます。

そのエントリを削除しようとするときに依存テーブルを削除する方法が絶対に必要な場合は、トリガーを使用する必要がありますが、トリガーのルールは、可能な限りそれらを避け、別の解決策が存在する場合はそれを使用することです。したがって、最終的には、ストアドプロシージャを使用することが最善のソリューションです。

于 2008-11-06T21:51:30.480 に答える