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

Tạo chỉ mục đa cột để thực thi tính duy nhất

Đây có vẻ là một sự hiểu lầm.

Trích dẫn của bạn từ câu trả lời của tôi hơi gây hiểu lầm, vì nó chỉ áp dụng nếu bạn cũng tạo chỉ mục một phần bổ sung như được mô tả ở đó:
Cách thêm chỉ mục duy nhất có điều kiện trên PostgreSQL

Nếu bạn không thêm chỉ mục thứ hai này (giống như bạn đã không), bạn đã có giải pháp của mình , Trông có vẻ. Chỉ với chỉ mục duy nhất nhiều cột, bạn có thể nhập (1, NULL) nhiều lần, nhưng (1,2) hoặc (1,3) chỉ một lần.

Chuỗi trống

Nếu do nhầm lẫn, bạn đang xem xét các chuỗi trống ('' ) (cho loại ký tự ) thay vì NULL giá trị:chúng được xử lý giống như bất kỳ giá trị nào khác. Bạn có thể giải quyết tình huống này bằng cách sử dụng chỉ mục duy nhất đa cột, một phần chức năng ( lập chỉ mục trên một biểu thức ):

CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

Bằng cách này, bạn có thể nhập (1, 'a') , (1, 'b') chỉ một lần.
Nhưng (1, NULL)(1, '') nhiều lần.

Tác dụng phụ

Chỉ mục sẽ vẫn hỗ trợ đầy đủ các truy vấn thuần túy trên cột đầu tiên (tat ).
Nhưng các truy vấn trên cả hai cột sẽ phải khớp với biểu thức để sử dụng toàn bộ tiềm năng. Điều này sẽ nhanh hơn, ngay cả khi nó có vẻ không hợp lý:

SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

.. hơn thế này:

SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

.. bởi vì truy vấn đầu tiên có thể sử dụng cả hai cột chỉ mục. Kết quả sẽ giống nhau (ngoại trừ khi tìm kiếm '' hoặc NULL ). Chi tiết về câu trả lời liên quan này trên dba.SE .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tạo INTERSECT bằng Eloquent Builder mà không cần có bộ sưu tập

  2. Cách thực hiện truy vấn ActiveRecord nhóm này trong postgres

  3. Cách bỏ một khóa tham gia khi tham gia hai bảng

  4. Cách so sánh hai trường trong laravel và postgres

  5. Làm cách nào để có được kích thước của một cột ARRAY?