当前位置: 首页 > news >正文

数据库配置级联数删除 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 表中可能还会有其他相关的字段,例如支付方式、支付时间等。

详细举例说明

场景:航班订票系统

假设你在开发一个航班订票系统,数据库里需要记录用户购买的机票和他们为这些机票支付的费用。

  1. Ticket 表
    每当用户购买一张机票时,系统会在 Ticket 表中插入一条记录。
    例如:

    • 用户 A(user_id = 1001)购买了票证,系统自动为这张票生成 id = 1。
    • Ticket 表中可能记录如下:
      id | user_id | 其他信息
      --------------------------
      1  | 1001    | 出发时间、航班号、座位信息等
      
  2. Payment 表
    当用户支付票款时,系统会在 Payment 表中插入一条记录,并且记录票证的 id(例如 ticket_id = 1)。
    例如:

    • 对应票证 id = 1 的支付记录可能为:
      id | ticket_id | amount | 其他信息
      --------------------------------------
      1  | 1         | 250.00 | 支付方式、支付时间等
      
  3. 删除操作及级联删除
    当用户取消订票时,系统会删除 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),防止出现孤立的数据。


举例说明

假设你有一个航班订票系统,记录用户购买的机票和相关的支付信息:

  1. Ticket 表记录机票信息:

    +----+---------+---------------------+
    | id | user_id |      其他字段       |
    +----+---------+---------------------+
    | 1  |  1001   |  机票信息,如航班号  |
    +----+---------+---------------------+
    
  2. Payment 表记录支付信息:

    +----+-----------+---------+-----------------+
    | id | ticket_id | amount  |   其他字段      |
    +----+-----------+---------+-----------------+
    | 1  |     1     | 250.00  | 支付时间、方式等 |
    +----+-----------+---------+-----------------+
    

在这个例子中,Payment 表中的 ticket_id 为 1,正好对应 Ticket 表中 id 为 1 的票证。这样,每笔支付记录都能清楚地知道它属于哪张票。


总结

Payment 表中的 ticket_id 字段用于建立与 Ticket 表中 id 字段的外键关联,从而保证每个支付记录都能准确地对应到一张机票,这不仅维护了数据的完整性,也方便在删除操作时自动清理相关数据。

相关文章:

  • 在CentOS 7上安装和使用Spleeter音频分离工具的详细步骤
  • 【LeetCodehHot100_0x01】
  • VUE2.0+elementUI+腾讯云点播上传视频
  • Python游戏编程之赛车游戏6-2
  • vue2和vue3响应式的区别
  • zookeeper从入门到精通
  • LabVIEW Browser.vi 库说明
  • [SWPUCTF 2022 新生赛]ez_rce
  • 前端基础知识
  • 蓝桥杯单片机组第十二届省赛第二批次
  • VMware中安装的ubuntu虚拟机屏幕由居中设置为最大化
  • Dify 工作流分类器技巧
  • LeetCode 热题100 2. 两数相加
  • JS高德地图实现降雨降雪效果
  • DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
  • Java 登录框架
  • 模板方法模式
  • 数字信任的底层逻辑:密码学核心技术与现实应用
  • 计算机毕业设计SpringBoot+Vue.js墙绘产品展示交易平台(源码+文档+PPT+讲解)
  • [AI]从零开始的树莓派运行DeepSeek模型教程
  • 域名做网站自己的电脑/找网络公司做推广费用
  • 电脑哪里做模板下载网站/seo赚钱暴利
  • 教你如何用天翼云盘做网站/现在推广什么app最挣钱
  • 网站规划的原则有哪些/b2b网站排名
  • 82端口做网站/个人网上卖货的平台
  • 做神马网站快速排/企业营销策划有限公司