Tôi phải theo dõi các bản sửa đổi các bản ghi trong một bảng. Những gì tôi đã làm là tạo ra một bảng thứ hai kế thừa từ đầu tiên và thêm một bộ đếm sửa đổi.theo dõi các bản sửa đổi trong postgresql
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
Sau đó, tôi đã tạo trình kích hoạt sẽ cập nhật bảng B mỗi lần A được chèn/cập nhật. Những gì tôi không thể tìm ra là làm thế nào để làm cho B.revision giữ một "chuỗi" cá nhân cho mỗi id.
Ví dụ: bảng A có 2 hàng, i & j.
tôi đã được cập nhật 3 lần và cần có 3 bản sửa đổi: (1, 2, 3).
j đã được cập nhật 2 lần và cần có hai bản sửa đổi: (1, 2).
Đây là những gì tôi có cho đến nay, có thể tôi sẽ đi sai đường và ai đó có thể giúp tôi!
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision MAX(revision) FROM B WHERE id = NEW.id;
IF NOT FOUND THEN
last_revision := 0;
END IF;
INSERT INTO B SELECT NEW.*;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
FOR EACH ROW EXECUTE PROCEDURE table_update();
Điều này rất có ý nghĩa. Nó sẽ là tốt nhất mà OP thay đổi yêu cầu của mình để nhường chỗ cho điều này, bởi vì những thứ khác sẽ yêu cầu khóa như bạn đề cập đến. –
Hrm. Và tôi chỉ nhận thấy rằng nó không hiển thị thông tin sửa đổi thực tế. Tôi chèn bản ghi tại r1 là "bar" và cập nhật nó trong r3 là "bạn", nhưng kết quả trong truy vấn cuối cùng hiển thị "bạn" cho cả hai sửa đổi. Để khắc phục điều đó, B không nên kế thừa từ A. sử dụng 'LIKE' thay vì' INHERITS' để tách chúng ra: 'TẠO BẢNG B (THÍCH A, phiên bản nối tiếp NOT NULL);'. – theory
Hoặc sử dụng từ khóa "duy nhất". Nhưng có, nó có thể ít khó hiểu hơn để chỉ sử dụng các bảng riêng biệt. –