MST

星途 面试题库

面试题:MySQL外键约束在复杂业务场景下的应用

假设有一个电商系统,包含订单表(orders)、用户表(users)和商品表(products)。订单表记录了每个订单的信息,包括下单用户和所购买的商品。用户表存储用户的基本信息,商品表存储商品的详细信息。请设计这三个表的结构,并合理使用外键约束来确保数据的完整性。同时,阐述在外键约束下,删除用户和商品记录时可能遇到的问题及解决方案。
34.7万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

订单表(orders)

字段名数据类型说明外键约束
order_idint(11)订单ID,主键,自增-
user_idint(11)下单用户ID,关联 users 表的 user_idFOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE
product_idint(11)购买商品ID,关联 products 表的 product_idFOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE ON UPDATE CASCADE
order_datedatetime下单日期-
order_amountdecimal(10, 2)订单金额-

用户表(users)

字段名数据类型说明
user_idint(11)用户ID,主键,自增
usernamevarchar(50)用户名
emailvarchar(100)用户邮箱
phonevarchar(20)用户电话
addressvarchar(200)用户地址

商品表(products)

字段名数据类型说明
product_idint(11)商品ID,主键,自增
product_namevarchar(100)商品名称
pricedecimal(10, 2)商品价格
descriptiontext商品描述

删除用户和商品记录时可能遇到的问题及解决方案

  1. 删除用户记录
    • 问题:由于订单表通过外键关联了用户表,如果直接删除用户记录,会违反外键约束,导致删除失败。
    • 解决方案
      • 级联删除(CASCADE):在创建外键约束时设置 ON DELETE CASCADE,如上述订单表创建语句。这样当删除用户记录时,与之关联的订单记录也会被自动删除。
      • 先删除关联订单:在删除用户之前,先手动删除订单表中该用户的所有订单记录,然后再删除用户记录。
  2. 删除商品记录
    • 问题:同样,订单表通过外键关联了商品表,直接删除商品记录会违反外键约束。
    • 解决方案
      • 级联删除(CASCADE):在创建外键约束时设置 ON DELETE CASCADE,当删除商品记录时,与之关联的订单记录也会被自动删除。
      • 先处理关联订单:可以先更新订单表中相关订单,将商品ID设置为一个特殊值(如0表示已删除商品),或者将订单标记为无效等处理方式,然后再删除商品记录。