Çakışmayan zaman aralıklarına sahip girişler nasıl sağlanır?

oy
1

Benim veritabanı sadece iki veya daha fazla sütun benzersiz girişleri içermesini sağlamak gerekir. Bu kolayca bir UNIQUE bu sütunlar üzerindeki kısıtlama.

Benim durumumda, sadece çakışan zaman aralıkları için çoğaltmayı yasaklamam gerekiyor. Tablo var valid_from ve valid_to sütunlar. Bazı durumlarda öncelikle aktif girişi sona erdirmek gerekebilir. valid_to = now ve ardından, valid_from = now ve valid_to = infinity .

Kullanmadan herhangi bir sorun yaşamadan önceki girişin süresini doldurabiliyorum UPDATE , ancak yeni sütunları eklemek temel sütunlarım şu anda olduğundan sorunlu görünüyor UNIQUE ve bu nedenle tekrar eklenemez.

Eklemeyi düşündüm valid_from ve valid_to bir parçası olarak UNIQUE ancak bu kısıtlamayı daha gevşek hale getirir ve kopyaların ve çakışan zaman aralıklarının var olmasına izin verir.

Çakışan yinelenen öğelerin bulunmamasını sağlamak için nasıl bir kısıtlama yaparım valid_from ve valid_totsrange ?

Arıyorum EXCLUDE USING GIST , ancak birden çok sütunu desteklemiyor gibi görünüyor? Bu benim için işe yaramıyor:

ALTER TABLE registration 
DROP Constraint IF EXISTS registration_{string.Join('_', listOfAttributes)}_key, 
ADD Constraint registration_{string.Join('_', listOfAttributes)}_key EXCLUDE USING GIST({string.Join(',', listOfAttributes)} WITH =, valid WITH &&);
Oluştur 10/05/2020 saat 19:31
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Doğru yoldaydın. Ancak hariç tutma kısıtlamalarının sözdizimi biraz farklıdır:

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 timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Ek modülü takmanız gerekebilir btree_gist ilk olarak, açıklanmayan tablo tanımınıza bağlı olarak.

Her sütunun ilgili operatörü ile birlikte listelenmesi gerekir.

Ve bir aralık tipine ihtiyacınız var. varsayarsak timestamp with time zone için valid_from ve valid_to , ifade tstzrange(valid_from, valid_to) yapardı.

İlişkili:


Belki , üstün bir tasarım, sizin registration tablo ve 1-N girişleri yeni registration_range tablo. Ve şu anda geçerli girişi belirlemek için bazı mantık (zaman içinde herhangi bir nokta için). Açıklanmayan bilgilere bağlıdır.

Cevap 13/05/2020 saat 18:31
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more