首页 > 解决方案 > 如何在 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 很陌生。

标签: sqldatabasepostgresqlconstraints

解决方案


解决此类问题有两种方法:

  1. 如果条件不满足,请使用引发错误的触发器。SERIALIZABLE不利的一面是,除非您使用(更昂贵的)隔离级别,否则总是存在竞争条件。

  2. 通过复制表 B 中 A 的列来非规范化数据模型。 A 上的触发器确保值始终相同。然后你CHECK对 B 有一个简单的约束。这里的缺点是数据重复。

由于触发器,这两种方法都会产生性能开销。因此,选择在表上具有较少修改的触发器的解决方案是有利的。如果您有高并发,请选择第二个变体以避免竞争条件。


推荐阅读