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

Ngăn chặn các mục nhập liền kề / chồng chéo với EXCLUDE trong PostgreSQL

Các loại phạm vi bao gồm một đường viền dưới và một đường viền trên, có thể được bao gồm hoặc loại trừ. Trường hợp sử dụng điển hình (và mặc định cho các loại phạm vi) là bao gồm thấp hơn và loại trừ giới hạn trên.

Loại trừ chồng chéo phạm vi có vẻ rõ ràng. Có một ví dụ mã hay trong sách hướng dẫn

Ngoài ra, hãy tạo một ràng buộc loại trừ khác sử dụng toán tử liền kề -|- cũng để loại trừ liền kề mục. Cả hai đều phải dựa trên GiST lập chỉ mục dưới dạng GIN hiện không được hỗ trợ cho việc này.

Để giữ cho nó sạch sẽ, tôi sẽ thực thi [) giới hạn (bao gồm cả dưới và không bao gồm trên) cho tất cả các mục nhập có CHECK hạn chế sử dụng các hàm phạm vi:

CREATE TABLE tbl (
   tbl_id serial PRIMARY KEY
 , tsr tsrange
 , CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&)
 , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-)
 , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);

db <> fiddle here
(SQL Fiddle cũ)

Thật không may, điều này tạo ra hai các chỉ mục GiST giống hệt nhau để thực hiện cả hai ràng buộc loại trừ, trong đó, một cách hợp lý là đủ. Đó dường như là một thiếu sót của việc triển khai hiện tại (ít nhất là Postgres 11).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao CHỌN mà không có cột hợp lệ

  2. Trả lại một truy vấn từ một hàm?

  3. Tự động hóa các công việc hàng ngày của PostgreSQL bằng Jenkins

  4. Cách Acosd () hoạt động trong PostgreSQL

  5. tại sao PG ::UniqueViolation:LỖI:giá trị khóa trùng lặp vi phạm ràng buộc duy nhất?