トリガー機能に関するその他のアドバイス:
CREATE OR REPLACE FUNCTION delete_question()
RETURNS trigger AS
$func$
BEGIN
CASE OLD.que_type
WHEN 1 THEN
DELETE FROM mcq WHERE que_id=OLD.id;
WHEN 2, 3 THEN
DELETE FROM tffb WHERE que_id=OLD.id;
WHEN 4 THEN
DELETE FROM essay WHERE que_id=OLD.id;
-- ELSE
-- Do something?
END CASE;
RETURN OLD;
END
$func$ LANGUAGE plpgsql;
主なポイント
-
SELECT
を使用した存在の確認 ステートメントはコストを2倍にします。DELETE
を実行するだけです 、一致する行が見つからない場合、何も削除されません。 -
CASE
を使用する ここに声明。より短く、より速く。 plpgsqlCASE
SQLCASE
とは少し異なります 声明。たとえば、一度に複数のケースを一覧表示できます。 -
DECLARE
は必要ありません 実際に変数を宣言しない限り、キーワード。
代替設計
カスケード削除により、この問題を完全に回避できます。外部キー経由 、@a_horseがコメントに記載されています 。私のスキーマレイアウトは次のようになります:
CREATE TABLE question (
question_id serial NOT NULL PRIMARY KEY
,que_type int -- this may be redundant as well
);
CREATE TABLE essay (
que_id int NOT NULL PRIMARY KEY
REFERNECES question(question_id) ON UPDATE CASCADE
ON DELETE CASCADE
,ans text
);
...
serial
について :
SQL関数の自動インクリメント