Đừng. Nó đã được thử nhiều lần và đó là một nỗi đau.
Sử dụng serial
đơn giản hoặc IDENTITY
cột:
- Cột bảng tăng dần tự động
CREATE TABLE address_history (
address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);
Sử dụng hàm cửa sổ row_number()
để nhận số sê-ri không có khoảng trống trên mỗi person_id
. Bạn có thể duy trì một VIEW
mà bạn có thể sử dụng để thay thế cho bảng của mình trong các truy vấn để chuẩn bị sẵn những con số đó:
CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
ORDER BY address_history_id) AS adr_nr
FROM address_history;
Xem:
- Trình tự không có khoảng trống trong đó có nhiều giao dịch với nhiều bảng tham gia
Hoặc bạn có thể muốn ORDER BY
thứ gì khác. Có thể created_at
? Tốt hơn created_at, address_history_id
để phá vỡ các ràng buộc có thể có. Câu trả lời liên quan:
- Cột có các sê-ri thay thế
Ngoài ra, kiểu dữ liệu bạn đang tìm là timestamp
hoặc timestamptz
, không phải trong Postgres:datetime
- Bỏ qua hoàn toàn các múi giờ trong Rails và PostgreSQL
Và bạn chỉ cần lưu trữ previous_address
(hoặc chi tiết hơn), không phải , cũng không phải address
. Cả hai đều sẽ dư thừa trong một mô hình dữ liệu lành mạnh. original_address