Qt CreatorにSQLiteデータベース接続を使用してC++アプリケーションを作成しています。私が達成したいのは、テーブルから行を削除すると、それを参照する他のテーブルの行も削除されるということです。したがって私のケースでは、バスケットから行を削除すると、コンピュータから行を参照することも削除され、サブタブテーブル、サブスクライバ、規制などから最後まで削除されます。ここでbefore delete trigger低性能
は私のデータベース・ダイアグラムである:
私は別のテーブルとの外部キー参照を持つ各テーブルのトリガーを作成しました。
CREATE TRIGGER delete_fk BEFORE DELETE ON Basket
FOR EACH ROW BEGIN
DELETE FROM Computer WHERE computer.basket = old.id_basket;
END
CREATE TRIGGER delete_fk_comp BEFORE DELETE ON computer
FOR EACH ROW BEGIN
DELETE FROM subsystemtable WHERE subsystemtable.computer = id.id_computer;
END
CREATE TRIGGER delete_fk_subscriber_map BEFORE DELETE ON subscriber
FOR EACH ROW BEGIN
DELETE FROM mappingtable WHERE mappingtable.subscriber = old.id_subscriber;
END
CREATE TRIGGER delete_fk_subscriber_indirect BEFORE DELETE ON subscriber
FOR EACH ROW BEGIN
DELETE FROM indirectsubscriber WHERE indirectsubscriber.subscriber = old.id_subscriber;
END
CREATE TRIGGER delete_fk_subscriber BEFORE DELETE ON subscriber
FOR EACH ROW BEGIN
DELETE FROM reserve WHERE reserve.subscriber = old.id_subscriber;
END
CREATE TRIGGER delete_fk_subscriber_res BEFORE DELETE ON subscriber
FOR EACH ROW BEGIN
DELETE FROM reserve WHERE reserve.subscriber_res = old.id_subscriber;
END
CREATE TRIGGER delete_fk_subs BEFORE DELETE ON subsystem
FOR EACH ROW BEGIN
DELETE FROM subsystemtable WHERE subsystemtable.subsystem = old.id_subsystem;
END
CREATE TRIGGER delete_fk_substable_reg BEFORE DELETE ON subsystemtable
FOR EACH ROW BEGIN
DELETE FROM regulations WHERE regulations.subsystem = old.id;
END
CREATE TRIGGER delete_fk_substable BEFORE DELETE ON subsystemtable
FOR EACH ROW BEGIN
DELETE FROM subscriber WHERE subscriber.subsystem = old.id;
END
私は欲しかったものを得ました。それはまさに私が望んでいたように機能します。しかし、今私の問題は低いパフォーマンスです。私のデータベースでは、各バスケットに約20台のコンピュータがあり、各コンピュータに約5台のサブシステム、各サブシステムに100台のサブスクライバがあります。私が1つの単一バスケットを削除すると、全体の手順は約400ミリ秒かかります。一度に3つのバスケットを削除する必要があります、それはすでに3秒以上かかるでしょう。
私はこれをより速く動作させる方法を見つける必要があります。約200〜300ミリ秒で制限されています。そして私はそれをどうやって行うことができるかについての提案が必要です。
他の成熟したデータベースシステムを使用しますか?例えば、PostgreSQL。または、外部キーを適切に使用してください(https://www.sqlite.org/foreignkeys.html#fk_actions)。 'カスケード'。 – maxik