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

Làm thế nào để đảm bảo các mục nhập có phạm vi thời gian không trùng lặp?

Bạn đã đi đúng hướng. Nhưng cú pháp cho các ràng buộc loại trừ hơi khác một chút.

Tùy thuộc vào định nghĩa bảng không được tiết lộ, bạn có thể cần phải cài đặt tiện ích mở rộng (mô-đun bổ sung) btree_gist Đầu tiên. Một lần mỗi db. Nó cần thiết cho ví dụ của tôi vì lớp toán tử bắt buộc không được cài đặt cho loại integer theo mặc định:

CREATE EXTENSION btree_gist;

Xem:

Sau đó:

CREATE TABLE registration  (
  tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a  integer NOT NULL
, col_b  integer NOT NULL
, valid_from timestamp
, valid_to   timestamp
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);

Mỗi cột cần được liệt kê với toán tử tương ứng.

Và bạn cần một loại phạm vi . Bạn đề cập đến các cột riêng biệt valid_fromvalid_to . Và bạn cũng đề cập đến tsrangevalid trong lệnh không thành công. Thật khó hiểu. Giả sử hai timestamp cột, một chỉ mục biểu thức với biểu thức tsrange(valid_from, valid_to) sẽ làm điều đó.

Có liên quan:

Thông thường, timestamptz (tstzrange ) nên được chọn trên timestamp (tsrange ). Xem:

Có thể , một thiết kế cao cấp sẽ là mối quan hệ một-nhiều giữa registration của bạn bảng và các mục nhập 1-N trong registration_range mới bàn. Và một số logic để xác định mục nhập hiện hợp lệ (cho bất kỳ thời điểm nào đã cho). Phụ thuộc vào thông tin chưa được tiết lộ nhiều hơ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. chmod og-rwx server.key trong windows

  2. Nhập các tệp XML vào PostgreSQL

  3. Làm cách nào để chèn nhiều hàng bằng khóa ngoại bằng CTE trong Postgres?

  4. Cách kiểm tra xem vĩ độ dài có nằm trong giới hạn thành phố không

  5. Loại bỏ dấu ngoặc kép khỏi trường json một cách có chọn lọc trong PostgreSQL