ฉันสร้างฟังก์ชั่นที่เป็นตารางทั่วไปที่กว้างกว่า
CREATE OR REPLACE FUNCTION keep_row_number_steady()
RETURNS TRIGGER AS
$body$
DECLARE
tab text;
keyfld text;
nritems INTEGER;
rnd DOUBLE PRECISION;
BEGIN
tab := TG_ARGV[0];
keyfld := TG_ARGV[1];
nritems := TG_ARGV[2];
rnd := TG_ARGV[3];
IF random() < rnd
THEN
EXECUTE(format('DELETE FROM %s WHERE %s < (SELECT %s FROM %s ORDER BY %s DESC LIMIT 1 OFFSET %s)', tab, keyfld, keyfld, tab, keyfld, nritems));
END IF;
RETURN NULL;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER log_table_keep_row_number_steady_trigger
AFTER INSERT ON log_table
FOR EACH STATEMENT EXECUTE PROCEDURE keep_row_number_steady('log_table', 'id', 1000, 0.1);
ฟังก์ชันใช้พารามิเตอร์ 4 ตัว:
- แท็บ: ชื่อตาราง
- keyfld: ฟิลด์คีย์ตัวเลข, โปรเกรสซีฟ
- nritems: จำนวนรายการที่จะเก็บ
- rnd: สุ่มหมายเลขจาก 0 ถึง 1; ยิ่งมีขนาดใหญ่ขึ้นตารางที่ใช้บ่อยจะถูกทำความสะอาดมากขึ้น (0 = ไม่เคย 1 = เสมอ 0.1 = 10% ของจำนวนครั้ง)
วิธีนี้คุณสามารถสร้างจำนวนทริกเกอร์ที่คุณต้องการเรียกใช้ฟังก์ชันเดียวกัน
หวังว่านี่จะช่วยได้