Anda berada di jalur yang benar. Tetapi sintaks untuk batasan pengecualian sedikit berbeda.
Bergantung pada definisi tabel yang dirahasiakan, Anda mungkin perlu memasang ekstensi
(modul tambahan) btree_gist
pertama. Sekali per db. Ini diperlukan untuk contoh saya karena kelas operator yang diperlukan tidak diinstal untuk tipe integer
secara default:
CREATE EXTENSION btree_gist;
Lihat:
- Kesalahan PostgreSQL MENGECUALIKAN MENGGUNAKAN:Integer tipe data tidak memiliki kelas operator default
- Cara menggunakan ( install) dblink di PostgreSQL?
Kemudian:
CREATE TABLE registration (
tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a integer NOT NULL
, col_b integer NOT NULL
, valid_from timestamp
, valid_to timestamp
, CONSTRAINT no_overlap
EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);
Setiap kolom harus terdaftar dengan operatornya masing-masing.
Dan Anda memerlukan tipe rentang . Anda menyebutkan kolom terpisah valid_from
dan valid_to
. Dan Anda juga menyebutkan tsrange
dan valid
dalam perintah yang gagal. Itu membingungkan. Dengan asumsi dua timestamp
kolom, indeks ekspresi dengan ekspresi tsrange(valid_from, valid_to)
akan melakukannya.
Terkait:
- Lakukan ini jam operasi kueri di PostgreSQL
- Rentang stempel waktu berkelanjutan yang tidak tumpang tindih (tstzrange) untuk jam buka
- Kueri Postgresql 9.4 semakin lambat saat bergabung dengan TSTZRANGE dengan &&
- Simpan hari dalam seminggu dan waktu?
Biasanya, timestamptz
(tstzrange
) harus dipilih di atas timestamp
(tsrange
). Lihat:
Mungkin , desain yang unggul akan menjadi hubungan satu-ke-banyak antara registration
. Anda tabel dan entri 1-N dalam registration_range
baru meja. Dan beberapa logika untuk menentukan entri yang valid saat ini (untuk titik waktu tertentu). Tergantung pada informasi yang lebih dirahasiakan.