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

Mencegah entri yang berdekatan/tumpang tindih dengan EXCLUDE di PostgreSQL

Jenis rentang terdiri dari batas bawah dan batas atas, yang dapat disertakan atau dikecualikan. Kasus penggunaan umum (dan default untuk jenis rentang) adalah menyertakan bagian bawah dan kecualikan batas atas.

Tidak termasuk tumpang tindih rentang tampak jelas. Ada contoh kode yang bagus di manual

Selain itu, buat batasan pengecualian lain menggunakan operator yang berdekatan -|- untuk juga mengecualikan berdekatan entri. Keduanya harus didasarkan pada GiST indeks karena GIN saat ini tidak didukung untuk ini.

Untuk menjaganya tetap bersih, saya akan menerapkan [) batas (termasuk bawah dan tidak termasuk atas) untuk semua entri dengan CHECK batasan menggunakan fungsi rentang:

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<>main biola di sini
(Fiddle SQL Lama)

Sayangnya, ini menghasilkan dua indeks GiST identik untuk mengimplementasikan kedua batasan pengecualian, di mana satu akan cukup, secara logis. Itu tampaknya menjadi kekurangan dari implementasi saat ini (hingga setidaknya 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. konversi tipe data MySQL SET ke Postgres

  2. SUM() Fungsi di PostgreSQL

  3. Bagaimana cara mengambil komentar dari database PostgreSQL?

  4. Instalasi Odoo di Mac Tidak Dapat Menjalankan Perintah LESSC

  5. Cara Mengatur Koneksi Jarak Jauh ke PostgreSQL