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

Số sê-ri trên mỗi nhóm hàng cho khóa ghép

Đừ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 datetime trong Postgres:

  • 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 address , cũng không phải original_address . Cả hai đều sẽ dư thừa trong một mô hình dữ liệu lành mạnh.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi vai trò sau khi kết nối với cơ sở dữ liệu

  2. Tên Ràng buộc Mặc định trong PostgreSQL là gì?

  3. IntegrityError:phân biệt giữa ràng buộc duy nhất và không vi phạm rỗng

  4. PostgreSQL vô hiệu hóa nhiều đầu ra hơn

  5. Truy vấn PostgreSQL với Npgsql và Entity Framework bằng cách sử dụng unaccent