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

Chỉ mục duy nhất một phần PostgreSQL và nâng cấp

Tôi không nghĩ rằng có thể sử dụng nhiều chỉ mục từng phần làm mục tiêu xung đột. Bạn nên cố gắng đạt được hành vi mong muốn bằng cách sử dụng một chỉ mục duy nhất. Cách duy nhất tôi có thể thấy là sử dụng một chỉ mục duy nhất trên các biểu thức:

drop table if exists test;
create table test (
    p text not null,
    q text,
    r text,
    txt text
);

create unique index test_unique_idx on test (p, coalesce(q, ''), coalesce(r, ''));

Giờ đây, cả ba bài kiểm tra (được thực hiện hai lần) đều vi phạm cùng một chỉ mục:

insert into test(p,q,r,txt) values ('p',null,null,'a'); -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p','q',null,'b');  -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p',null, 'r','c'); -- violates test_unique_idx

Trong lệnh chèn, bạn nên chuyển các biểu thức được sử dụng trong định nghĩa chỉ mục:

insert into test as u (p,q,r,txt) 
values ('p',null,'r','d') 
on conflict (p, coalesce(q, ''), coalesce(r, '')) do update 
set txt = excluded.txt;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql generate_series của tháng

  2. Nối các mảng trong nhóm theo mệnh đề

  3. Hàng đợi công việc dưới dạng bảng SQL với nhiều người tiêu dùng (PostgreSQL)

  4. PostgreSQL:vai trò không được phép đăng nhập

  5. Truy vấn PostgreSQL - cột không tồn tại