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:
- PostgreSQL EXCLUDE SỬ DỤNG lỗi:Kiểu dữ liệu số nguyên không có lớp toán tử mặc định
- Cách sử dụng ( cài đặt) dblink trong PostgreSQL?
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_from
và valid_to
. Và bạn cũng đề cập đến tsrange
và valid
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ực hiện việc này số giờ truy vấn hoạt động trong PostgreSQL
- Phạm vi dấu thời gian liên tục, không trùng lặp (tstzrange) cho giờ mở cửa
- Truy vấn Postgresql 9.4 ngày càng chậm hơn khi tham gia TSTZRANGE với &&
- Lưu trữ ngày và giờ trong tuần?
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.