PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào tôi có thể xác định ràng buộc này?

Giải pháp cho những gì bạn yêu cầu

Giả sử bạn muốn thực thi điều đó:

  1. "Id_Lot" thực sự tồn tại trong "Lot"."Code" . -> Ràng buộc FK
  2. "Lot"."Empty" cho vị trí là TRUE chỉ vào thời điểm séc.

Bạn có thể thực hiện việc này với NOT VALID CHECK hạn chế sử dụng IMMUTABLE giả chức năng để kiểm tra trên bảng khác. Chi tiết:

Nhưng mô hình dữ liệu của bạn không ổn định ở một số khía cạnh. Tôi sẽ đề xuất một cách tiếp cận rõ ràng hơn nhiều.

Thiết kế gọn gàng hơn với ràng buộc loại trừ

Không lưu trữ cho dù lô hiện đang trống dư thừa với lô. Điều đó rất dễ xảy ra lỗi và dễ bị các vấn đề đồng thời. Thực thi rằng mỗi lô chỉ có thể được lấy một lần với ràng buộc loại trừ . Để điều đó hoạt động, hãy tiết kiệm thời gian thoát trong ticket , ngoài ra.

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

Không có trạng thái hiện tại dư thừa nào trong lot bảng.

Để ràng buộc loại trừ hoạt động, bạn cần mô-đun bổ sung btree_gist . Hướng dẫn chi tiết:

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))
);
  • Sử dụng loại dữ liệu phạm vi dấu thời gian tsrange cho thời gian đỗ xe during Nhập với NULL giới hạn trên, khi ô tô đi vào. Cập nhật giới hạn trên khi ô tô rời khỏi. Ngoài những thứ khác, điều này cũng giúp ô tô có thể đậu nhiều ngày.

  • Một số CHECK bổ sung các ràng buộc để thực thi các quy tắc cơ bản trên during :

Có liên quan:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kubernetes timescaledb statefulset:Các thay đổi bị mất khi giải trí pod

  2. Ngoại lệ Postgres:Không có kết quả nào được trả về bởi truy vấn.

  3. Làm cách nào để chèn một Điểm HÌNH HỌC PostGIS trong ORM trình tự?

  4. Làm cách nào để tạo một hàm lồng nhau trong PL / pgSQL?

  5. Làm thế nào để loại bỏ cơ sở dữ liệu PostgreSQL nếu có các kết nối đang hoạt động với nó?