PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kích hoạt để xóa các hàng khỏi các bảng có liên quan trước khi xóa các hàng khỏi bảng thực tế

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ạy DELETE , 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 plpgsql CASE hơi khác với SQL CASE 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Việc gọi hàm hoặc thủ tục đã lưu trữ sẽ không chèn và vẫn tiếp tục các thay đổi

  2. loại bỏ các giá trị mảng trùng lặp trong postgres

  3. Kết nối gộp với Pgbouncer trên PostgreSQL 9.0

  4. Postgres 9.4 bị treo khi làm mới chế độ xem vật chất hóa

  5. Không thể kết nối với PostgreSQL cục bộ