数据库配置级联数删除 ON DELETE CASCADE
示例代码:
CREATE TABLE Ticket (
id SERIAL PRIMARY KEY,
user_id INTEGER,
-- 其他字段...
);
CREATE TABLE Payment (
id SERIAL PRIMARY KEY,
ticket_id INTEGER REFERENCES Ticket(id) ON DELETE CASCADE,
amount DECIMAL,
-- 其他字段...
);
这段代码创建了两个数据库表:一个叫做 Ticket(机票表),一个叫做 Payment(支付记录表)。简单来说,就是用来存储机票信息和与机票相关的支付信息,并且设置了一个规则:当机票被删除时,与这张机票相关的支付记录会自动被删除。
代码逐行解释
1. 创建 Ticket 表
CREATE TABLE Ticket (
id SERIAL PRIMARY KEY,
user_id INTEGER,
-- 其他字段...
);
- CREATE TABLE Ticket:这行代码表示创建一个名为 Ticket 的表,用来存储机票数据。
- id SERIAL PRIMARY KEY:
- id:这是票证的唯一标识符。
- SERIAL:表示这个字段的值会自动生成(通常是一个自增的整数),不用我们手动填写。
- PRIMARY KEY:指定这个字段为主键,也就是说,每张票都有一个独一无二的 id,保证记录的唯一性。
- user_id INTEGER:这一列用来存储用户的ID,表示这个票证属于哪个用户。
- – 其他字段…:这表示表中可能还会有其他字段(比如出票时间、目的地、价格等),但在这个例子中没有详细列出。
2. 创建 Payment 表
CREATE TABLE Payment (
id SERIAL PRIMARY KEY,
ticket_id INTEGER REFERENCES Ticket(id) ON DELETE CASCADE,
amount DECIMAL,
-- 其他字段...
);
- CREATE TABLE Payment:这行代码表示创建一个名为 Payment 的表,用来存储支付记录。
- id SERIAL PRIMARY KEY:同样,给每个支付记录分配一个自动生成的唯一标识符。
- ticket_id INTEGER REFERENCES Ticket(id) ON DELETE CASCADE:
- ticket_id INTEGER:这一列用来存储与支付记录关联的票证的ID。
- REFERENCES Ticket(id):这表示 ticket_id 是一个外键,它指向 Ticket 表中的 id 字段。也就是说,每个支付记录都必须对应 Ticket 表中的一张机票。
- ON DELETE CASCADE:这是一个关键规则,意思是如果对应的 Ticket 记录被删除,那么数据库会自动删除所有与该票证相关联的 Payment 记录。这就避免了留下“孤儿记录”(即存在支付记录但找不到对应的票证)。
- amount DECIMAL:这一列用来存储支付的金额,可以是小数。
- – 其他字段…:表示 Payment 表中可能还会有其他相关的字段,例如支付方式、支付时间等。
详细举例说明
场景:航班订票系统
假设你在开发一个航班订票系统,数据库里需要记录用户购买的机票和他们为这些机票支付的费用。
-
Ticket 表
每当用户购买一张机票时,系统会在 Ticket 表中插入一条记录。
例如:- 用户 A(user_id = 1001)购买了票证,系统自动为这张票生成 id = 1。
- Ticket 表中可能记录如下:
id | user_id | 其他信息 -------------------------- 1 | 1001 | 出发时间、航班号、座位信息等
-
Payment 表
当用户支付票款时,系统会在 Payment 表中插入一条记录,并且记录票证的 id(例如 ticket_id = 1)。
例如:- 对应票证 id = 1 的支付记录可能为:
id | ticket_id | amount | 其他信息 -------------------------------------- 1 | 1 | 250.00 | 支付方式、支付时间等
- 对应票证 id = 1 的支付记录可能为:
-
删除操作及级联删除
当用户取消订票时,系统会删除 Ticket 表中的那条记录。- 因为 Payment 表中的 ticket_id 字段设置了 ON DELETE CASCADE,当 Ticket 表中的 id = 1 被删除时,数据库会自动删除所有 ticket_id = 1 的 Payment 记录。
- 这样,你就不会有支付记录孤立存在,而找不到对应的票证。
打个比方:
想象你有一本账本记录所有机票(Ticket),每张机票上还有附带的收据(Payment)。如果你把某张机票从账本中撕掉(删除 Ticket),账本的规则(ON DELETE CASCADE)会自动把与这张票相关的收据也撕掉(删除 Payment),以确保账本里不会有只剩下收据而没有票的信息。
通过这种方式,不仅可以确保数据的完整性和一致性,还能简化代码逻辑,避免手动去删除关联数据。
Payment 表中的 ticket_id 字段就是用来关联 Ticket 表中的 id 的
详细解释
-
外键关联:
在数据库中,通过将一个表中的字段(这里是 Payment 表中的 ticket_id)设置为指向另一个表的主键(Ticket 表中的 id),我们就建立了外键关联。这种关联确保了每个支付记录都必须对应一张存在的票。 -
数据完整性:
这种关联关系有助于确保数据一致性。如果票证不存在,那么支付记录也不应该存在;同时,如果删除某个票证(Ticket),数据库可以根据设定(如 ON DELETE CASCADE)自动删除所有与该票证关联的支付记录(Payment),防止出现孤立的数据。
举例说明
假设你有一个航班订票系统,记录用户购买的机票和相关的支付信息:
-
Ticket 表记录机票信息:
+----+---------+---------------------+ | id | user_id | 其他字段 | +----+---------+---------------------+ | 1 | 1001 | 机票信息,如航班号 | +----+---------+---------------------+
-
Payment 表记录支付信息:
+----+-----------+---------+-----------------+ | id | ticket_id | amount | 其他字段 | +----+-----------+---------+-----------------+ | 1 | 1 | 250.00 | 支付时间、方式等 | +----+-----------+---------+-----------------+
在这个例子中,Payment 表中的 ticket_id 为 1,正好对应 Ticket 表中 id 为 1 的票证。这样,每笔支付记录都能清楚地知道它属于哪张票。
总结
Payment 表中的 ticket_id 字段用于建立与 Ticket 表中 id 字段的外键关联,从而保证每个支付记录都能准确地对应到一张机票,这不仅维护了数据的完整性,也方便在删除操作时自动清理相关数据。