sql - 每个关系约束只有一个活动
问题描述
所以我的作业有这个问题。我有两个实体:订单,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 );
解决方案
有点儿
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
推荐阅读
- ios - Swift 如何从自定义 uicollectionviewcell 中获取数据?
- eclipse - 如何在 Eclipse 中安装 Erlide 时修复“收到致命警报:handshake_failure”错误
- python - 使用 JSON 键创建数据框
- c# - C# 使用公钥和私钥创建 RSA256 JWT
- mysql - 在开始新的更改操作之前缺少逗号。(靠近“字符集”)
- c++ - 是否存在 x + 1 == x 的 float 类型的值 x?
- vb.net - 无法在即时模式下访问 Word 类的类成员
- java - PageFactory 初始化问题
- python - 如何捕获异常 MaxRetryError?
- c++ - ESP8266 I2C 从机不确认数据