首页 > 解决方案 > 每个关系约束只有一个活动

问题描述

所以我的作业有这个问题。我有两个实体:订单,Gifr_cupon。我有两张桌子:Orders、Gift_Cupons。

每个订单可以有很多杯或没有。每个 Cupon 都没有或只有一个订单。但是每个订单只能激活一个 cupon。

如何通过约束来强制执行?

下面是 DDL 的逻辑和 ER 视图:

在此处输入图像描述 在此处输入图像描述 动态链接库:

CREATE TABLE gift_cupons (
cupon_id         INTEGER NOT NULL,
order_order_id   INTEGER,
active           INTEGER NOT NULL
);

ALTER TABLE gift_cupons ADD CONSTRAINT gift_cupon_pk PRIMARY KEY ( cupon_id 
);
ALTER TABLE gift_cupons ADD CHECK gift_cupon_check CHECK(active IS NULL OR ( active >= 0 AND active <=1 ) );

CREATE TABLE orders (
order_id INTEGER NOT NULL
);

ALTER TABLE orders ADD CONSTRAINT order_pk PRIMARY KEY ( order_id );

ALTER TABLE gift_cupons
ADD CONSTRAINT gift_cupon_order_fk FOREIGN KEY ( order_order_id )
    REFERENCES orders ( order_id );

标签: sqloracleconstraints

解决方案


有点儿

Cupon - is bound to -> Order;
Order - has active -> Cupon;

Cupon (
Id PK,
orderId FK Order.Id,
Unique ( Id, orderId) -- any superset  of PK is unique
);

Order (
Id PK
ActiveCuponId,
(Id, ActiveCuponId) FK Cupon( OrderId, Id)
);

见小提琴https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=596b30905d02a9e5c799b16da5fff5ab


推荐阅读