PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Buat indeks multikolom untuk menegakkan keunikan

Ini sepertinya salah paham.

Kutipan Anda dari jawaban saya agak menyesatkan, karena itu hanya berlaku jika Anda juga membuat indeks parsial tambahan seperti yang dijelaskan di sana:
Cara menambahkan indeks unik bersyarat di PostgreSQL

Jika Anda tidak menambahkan indeks kedua ini (seperti yang tidak Anda lakukan), Anda sudah memiliki solusi , tampaknya. Dengan indeks unik multikolom saja, Anda dapat memasukkan (1, NULL) beberapa kali, tapi (1,2) atau (1,3) hanya sekali.

String kosong

Jika, secara tidak sengaja, Anda mempertimbangkan string kosong ('' ) (untuk jenis karakter ) bukannya NULL nilai:mereka ditangani seperti nilai lainnya. Anda bisa atasi situasi ini menggunakan indeks unik multikolom, sebagian fungsional (indeks pada ekspresi ):

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

Dengan cara ini Anda dapat memasukkan (1, 'a') , (1, 'b') hanya sekali.
Tapi (1, NULL) dan (1, '') beberapa kali.

Efek samping

Indeks masih akan sepenuhnya mendukung kueri biasa pada kolom pertama (tat ).
Tetapi kueri pada kedua kolom harus cocok dengan ekspresi untuk memanfaatkan potensi penuh. Ini akan lebih cepat, meskipun tampaknya tidak masuk akal:

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

.. dari ini:

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

.. karena kueri pertama dapat menggunakan kedua kolom indeks. Hasilnya akan sama (kecuali saat mencari '' atau NULL ). Rincian dalam jawaban terkait ini di 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. Ekspor skrip CREATE untuk database

  2. Apa perbedaan antara pengguna dan peran?

  3. Apakah ada cara untuk mengubah stempel waktu default Rails ke Y-m-d H:i:s (alih-alih Y-m-d H:i:s.u) atau laravel mengabaikan bagian desimal dari Y-m-d H:i:s.u?

  4. PostgreSQL 11 - Prosedur

  5. Haruskah saya menentukan INDEX dan UNIQUE INDEX?