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

Bagaimana saya bisa mendefinisikan batasan ini?

Solusi untuk pertanyaan Anda

Dengan asumsi Anda ingin menerapkannya:

  1. "Id_Lot" sebenarnya ada di "Lot"."Code" . -> Batasan FK
  2. "Lot"."Empty" untuk tempatnya adalah TRUE pada saat cek saja.

Anda bisa lakukan ini dengan NOT VALID CHECK batasan menggunakan IMMUTABLE fake palsu berfungsi untuk memeriksa di meja lain. Detail:

Tetapi model data Anda goyah dalam beberapa aspek. Saya akan menyarankan pendekatan yang lebih bersih.

Desain yang lebih bersih dengan batasan pengecualian

Jangan menyimpan apakah banyak saat ini kosong secara berlebihan dengan banyak. Itu sangat rawan kesalahan dan rentan terhadap masalah konkurensi. Terapkan bahwa setiap lot hanya dapat diambil sekali dalam satu waktu dengan batasan pengecualian . Agar itu berfungsi, simpan waktu keluar di ticket , sebagai tambahan.

CREATE TABLE lot (
  lot_id   varchar(4) NOT NULL PRIMARY KEY  -- I would use integer if possible
, lot_type text NOT NULL
);

Tidak ada status redundan saat ini di lot tabel.

Agar batasan pengecualian berfungsi, Anda memerlukan modul tambahan btree_gist . Instruksi terperinci:

CREATE TABLE ticket (
  ticket_id  serial PRIMARY KEY
, during     tsrange NOT NULL
, license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
, lot_id     int NOT NULL REFERENCES  lot
, CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
, CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
, CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
);
  • Menggunakan jenis data rentang stempel waktu tsrange untuk durasi parkir during .Masuk dengan NULL batas atas, saat mobil masuk. Perbarui dengan batas atas saat mobil keluar. Antara lain, ini juga memungkinkan mobil untuk parkir beberapa hari.

  • Beberapa tambahan CHECK batasan untuk menegakkan aturan dasar pada during :

Terkait:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gunakan perintah database_name di PostgreSQL

  2. KESALAHAN:batasan yang tidak memuaskan saat menginstal PostGIS pada gambar Alpine Docker

  3. Hubungan tidak ada

  4. Potong string setelah kemunculan karakter pertama

  5. Bagaimana cara mengatur fungsi PostgreSQL sebagai nilai default di GORM?