You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中实现ER图所示的Customer与Account表及关联约束?

实现Customer与Account的一对一关联(带级联删除)

嘿,根据你的需求,Customer和Account是严格的一对一关系:每个客户恰好拥有一个账户,每个账户也仅属于一个客户,同时删除客户时要自动删除关联账户。下面是具体的SQL实现方案,我会把关键逻辑讲清楚:

1. 先创建Customer表

首先定义客户表的基础结构,主键用自增ID来唯一标识客户,再加上一些常见的业务字段(你可以根据实际需求调整字段类型和约束):

CREATE TABLE Customer (
    customer_id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键,确保每个客户唯一
    name VARCHAR(100) NOT NULL, -- 客户姓名,非空约束
    email VARCHAR(100) UNIQUE NOT NULL, -- 邮箱必须唯一且不能为空
    phone VARCHAR(20) -- 联系电话,可选字段
);

2. 创建Account表(关联Customer并满足所有约束)

接下来创建账户表,核心是通过外键关联Customer,同时添加约束保证一对一关系,再设置级联删除:

CREATE TABLE Account (
    account_id INT PRIMARY KEY AUTO_INCREMENT, -- 账户主键
    account_number VARCHAR(50) UNIQUE NOT NULL, -- 账号唯一且非空
    balance DECIMAL(15,2) DEFAULT 0.00, -- 账户余额,默认初始为0
    customer_id INT NOT NULL, -- 关联客户的外键字段
    -- 外键约束:绑定Customer表的主键,设置级联删除
    FOREIGN KEY (customer_id) 
        REFERENCES Customer(customer_id)
        ON DELETE CASCADE,
    -- 唯一约束:确保一个customer_id只能对应一条Account记录,实现一对一
    UNIQUE (customer_id)
);

关键约束的作用说明

  • 一对一关系保障:Account表的customer_id字段同时设置了NOT NULL和UNIQUE约束——NOT NULL保证每个账户必须属于某个客户,UNIQUE保证一个客户最多只能有一个账户,两者结合就完美满足了「每个客户恰好一个账户、每个账户恰好一个客户」的要求。
  • 级联删除:外键的ON DELETE CASCADE属性会帮你自动处理关联删除——当你删除Customer表中的某条客户记录时,Account表中对应的账户记录会被自动删除,不用手动写额外的删除语句。

简单验证示例

插入测试数据

-- 插入一条客户记录
INSERT INTO Customer (name, email, phone) 
VALUES ('张三', 'zhangsan@example.com', '13800138000');

-- 插入对应账户(这里customer_id对应上面插入的客户ID,假设是1)
INSERT INTO Account (account_number, balance, customer_id) 
VALUES ('ACC001', 1000.00, 1);

测试级联删除

DELETE FROM Customer WHERE customer_id = 1;

执行这条语句后,你会发现Account表中customer_id=1的那条账户记录已经被自动删除了。

内容的提问来源于stack exchange,提问作者Chetan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:25:10