sql - 建立强制一到可选一
问题描述
假设我有三张桌子:
- 顾客
- 车辆
- 预订
我希望 Customer to Reservation 是 Mandatory-One 到 Optional-One(这意味着预订需要一位客户,而一位客户可以有零对一的预订)。
车辆也是如此:预订需要一辆车,而一辆车可以有零对一的预订。
我将如何创建这些表?
我尝试使用自己的 ID 列(C_ID、V_ID、R_ID)创建每个表作为 PK,然后在保留表中为 C_ID(非空)和 V_ID(非空)创建 FK 约束,但这似乎允许客户和车辆有多个预订。
正确的做法是对 Reservation 表中的 C_ID 和 V_ID(单独)应用唯一约束吗?
解决方案
是的,使客户外键列在您的预订表中唯一。像这样:
CREATE TABLE customers
( customer_id NUMBER NOT NULL,
CONSTRAINT customers_pk PRIMARY KEY ( customer_id ) );
CREATE TABLE reservations
( reservation_id NUMBER NOT NULL,
customer_id NUMBER NOT NULL,
CONSTRAINT reservations_pk PRIMARY KEY (reservation_id ),
CONSTRAINT reservations_fk1 FOREIGN KEY ( customer_id ) REFERENCES customers ( customer_id ),
CONSTRAINT reservations_u1 UNIQUE ( customer_id )
);
-- Fails, customer does not exist
insert into reservations ( reservation_id, customer_id ) VALUES ( 100, 10 );
-- Fails, reservation requires customer
insert into reservations ( reservation_id, customer_id ) VALUES ( 100, null );
-- Fine.. Customer does not need a reservation;
insert into customers ( customer_id ) VALUES ( 20 );
-- Fine. One reservation for one customer
insert into reservations ( reservation_id, customer_id ) VALUES ( 200, 20 );
-- Fails -- cannot have more than one reservation for same customer
insert into reservations ( reservation_id, customer_id ) VALUES ( 201, 20 );
推荐阅读
- c++ - 包含定义预处理器变量的不同文件
- python - 隔离出现术语的句子
- sql - 将子句添加到 case 语句会导致查询拖动
- python - Streamlit Multiselect - 使用 DF 的两列作为选项并返回一列
- sql - 编写满足两种情况的单个 SQL 查询
- .net - 如何使用“使用方法”将 CORS 添加到我的中间件
- amazon-web-services - 如何托管 API(用 Flask-SQLAlchemy 编写)以与 Docker 化的 MySQL 容器通信?
- python - 在抓取谷歌搜索结果时提取特定段落
- javascript - 动态显示收据,在其标题下显示单个供应商的所有产品以及该供应商的产品总量
- go - 找到低于零的最大值