Một số lời khuyên khác về chức năng kích hoạt của bạn:
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;
Những điểm chính
-
Kiểm tra sự tồn tại của bạn bằng
SELECT
tuyên bố tăng gấp đôi chi phí. Chỉ cần chạyDELETE
, nếu không tìm thấy hàng phù hợp, không có hàng nào bị xóa. -
Sử dụng
CASE
tuyên bố ở đây. Ngắn hơn, nhanh hơn. Lưu ý rằng plpgsqlCASE
hơi khác với SQLCASE
bản tường trình. Ví dụ:bạn có thể liệt kê một số trường hợp cùng một lúc. -
Bạn không cần
DECLARE
từ khóa, trừ khi bạn thực sự khai báo các biến.
Thiết kế thay thế
Bạn có thể tránh hoàn toàn sự cố bằng cách xóa theo tầng thông qua khóa ngoại , như @ a_horse được đề cập trong nhận xét . Bố cục giản đồ của tôi sẽ trông giống như sau:
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
);
...
Giới thiệu về serial
:
Hàm SQL tự động tăng dần