外键约束: 同一个属性字段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 "该基础数据已被引用,无法删除";
}
}