外键约束实现数据完整

外键约束: 同一个属性字段X在表一中是主键,而在表二中不是主键,则字段成为表二的外键

作用:(删除、修改操作) 保证数据的完整性 和 唯一性。

问题:当基础数据被后面的业务使用到后,将基础数据删除,后面已存在的业务数据会报错。

实现步骤:

一、创建带有外键约束的表

假设有两个表,一个是 ’base_data‘表用于存储基础数据,另一个是'business_data'表用于存储业务数据, 其中业务数据表通过 'base_data_id' 字段引用基础数据。

示例:

CREATE TABLE base_data (
    id BIGINT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE business_data (
    id BIGINT PRIMARY KEY,
    base_data_id BIGINT,
    description VARCHAR(255),
    CONSTRAINT fk_base_data FOREIGN KEY (base_data_id) REFERENCES base_data(id)
);


#business_data 表中的 base_data_id 是 base_data 表中的外键,建立了两者之间的引用关系。
#CONSTRAINT fk_base_data FOREIGN KEY (base_data_id) 定义了外键约束。

解析:
CONSTRAINT fk_base_data:
这是为外键约束命名。fk_base_data 是外键约束的名称,开发者可以自定义它。这个名称有助于在调试、错误处理时标识出是哪一个约束违反了规则。

FOREIGN KEY (base_data_id):
这表示 business_data 表中的 base_data_id 列是一个外键。外键用于确保此列中的值必须来自另一个表的某个列(通常是主键),从而在两个表之间创建关联关系。

REFERENCES base_data(id):
这定义了 business_data 表中的外键引用哪个表和列。在这个例子中,base_data_id 列引用 base_data 表中的 id 列。
换句话说,business_data 表中的每一条记录,其 base_data_id 的值必须存在于 base_data 表的 id 列中。如果你尝试插入一个 base_data_id 值在 base_data 表中不存在的记录,数据库将会抛出外键约束错误。
二、阻碍删除

当一条基础数据表中的数据被业务表数据使用,此时删除该表时 数据库会抛出一个外键约束错误('foreign key constraint violation'),从而阻碍删除。

DELETE FROM base_data WHERE id = 1;

# 如果 id = 1 的 base_data 已被 business_data 引用,数据库将抛出类似以下的错误:


ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
(`your_db`.`business_data`, CONSTRAINT `fk_base_data` FOREIGN KEY (`base_data_id`) REFERENCES `base_data` (`id`))
三、后端捕获数据库错误并给出相应提示
public String deleteBaseData(Long baseDataId) {
    try {
        // 尝试删除基础数据
        baseDataRepository.deleteById(baseDataId);
        return "删除成功";
    } catch (DataIntegrityViolationException e) {
        // 捕获外键约束错误并返回提示
        return "该基础数据已被引用,无法删除";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值