sql - 如何在 PostgreSQL 中为表“B”创建一个检查约束,以检查表“A”中的值是否至少为 1 或更多?
问题描述
如何在 PostgreSQL 中对表“B”(desired_amount)进行检查约束,以检查表“A”(available_amount)中的值是否至少为 1 或更多?
表 B:
CREATE TABLE public.cart_tb
(
cart_id integer NOT NULL,
inventory_id integer NOT NULL,
desired_amount integer NOT NULL,
row_status integer NOT NULL,
CONSTRAINT "cart_PK" PRIMARY KEY (cart_id, inventory_id),
CONSTRAINT "cart_UK" UNIQUE (cart_id),
CONSTRAINT "cart_inventory_FK" FOREIGN KEY (inventory_id)
REFERENCES public."Inventory_tb" (inventory_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
TABLESPACE pg_default;
ALTER TABLE public.cart_tb
OWNER to postgres;
表 A:
CREATE TABLE public."Inventory_tb"
(
inventory_id integer NOT NULL,
inventory_name character varying(100) COLLATE pg_catalog."default" NOT NULL,
brand character varying(100) COLLATE pg_catalog."default" NOT NULL,
inventory_category character varying(100) COLLATE pg_catalog."default" NOT NULL,
color character varying(100) COLLATE pg_catalog."default" NOT NULL,
date_added timestamp without time zone NOT NULL,
inventory_size character varying(100) COLLATE pg_catalog."default" NOT NULL,
list_price money NOT NULL,
sku character varying(100) COLLATE pg_catalog."default" NOT NULL,
available_amount integer NOT NULL,
row_status integer NOT NULL,
CONSTRAINT "inventory_PK" PRIMARY KEY (inventory_id)
)
TABLESPACE pg_default;
ALTER TABLE public."Inventory_tb"
OWNER to postgres;
这是一个学校项目,一个POS系统。总的来说,我对数据库和 SQL 很陌生。
解决方案
解决此类问题有两种方法:
如果条件不满足,请使用引发错误的触发器。
SERIALIZABLE
不利的一面是,除非您使用(更昂贵的)隔离级别,否则总是存在竞争条件。通过复制表 B 中 A 的列来非规范化数据模型。 A 上的触发器确保值始终相同。然后你
CHECK
对 B 有一个简单的约束。这里的缺点是数据重复。
由于触发器,这两种方法都会产生性能开销。因此,选择在表上具有较少修改的触发器的解决方案是有利的。如果您有高并发,请选择第二个变体以避免竞争条件。
推荐阅读
- c++ - 长有什么问题?为什么会自动减1?
- java - 我想将 Angular 6 前端连接到 java servlet
- java - JAVA 代码生成与 JWT 一起使用的 HS512 密钥
- ssh - bash bash xargs ssh bash 采购在远程节点上失败
- sql - 如何编写 count(columnValue) = 1 的查询
- git - Git cherry-pick 未能选择正确的更改
- python-3.x - 使用 mpld3 在 Web 浏览器中打印多个图
- angular - 如何在 Angular 5 中跟踪用户活动?
- php - Symfony 3.4 中无法捕获异常
- c# - 如何使用服务器的 IP 地址发送电子邮件