PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как мога да дефинирам това ограничение?

Решение за това, което искате

Ако приемем, че искате да наложите това:

  1. "Id_Lot" всъщност съществува в "Lot"."Code" . -> FK ограничение
  2. "Lot"."Empty" за мястото е TRUE само по време на проверката.

Вие можете направете това с NOT VALID CHECK ограничение с помощта на фалшив IMMUTABLE функция за проверка на другата маса. Подробности:

Но вашият модел на данни е нестабилен в редица аспекти. Бих предложил много по-чист подход.

По-чист дизайн с ограничение за изключване

Не съхранявайте дали партидата в момента е празна излишно с партидата. Това е много податливо на грешки и е податливо на проблеми с паралелността. Наложете, че всяка партида може да бъде взета само веднъж наведнъж с ограничение за изключване . За да работи това, запазете часа на излизане в ticket , допълнително.

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

Няма излишно текущо състояние в lot таблица.

За да работи ограничението за изключване, имате нужда от допълнителния модул btree_gist . Подробни инструкции:

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))
);
  • Използване на тип данни за диапазон от дата и време tsrange за продължителността на паркиране during .Въведете с горна граница NULL, когато колата влезе. Актуализирайте с горна граница, когато колата излезе. Наред с други неща, това също така прави възможно автомобилите да паркират няколко дни.

  • Някои допълнителни CHECK ограничения за налагане на основни правила за during :

Свързани:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да разберете дали upsert е актуализация с PostgreSQL 9.5+ UPSERT?

  2. Връща редове, които са максимум една колона в Postgresql

  3. Subsonic postgreSQL шаблон

  4. Писане на JSON колона в Postgres с помощта на Pandas .to_sql

  5. Проблем с accepts_nested_attributes_for в Rails 5.0.0.beta3, -api опция