跳到主要内容

外键

简介

外键用于检查引用表中是否存在对应的数据。

关系数据库中,外键(foreign key)是一种用于建立表与表之间关联关系的机制,起到了确保数据完整性、维护数据一致性、提高查询性能和规范化数据等作用,有助于建立稳定和可靠的数据库系统。

业务场景

外键约束用于确保表与表之间的数据完整性,以及建立表之间的关联关系。外键约束在电子商务、社交媒体、采购管理、学校管理系统、零售业等多种业务场景中发挥重要作用,可根据具体需求进行配置。

示例

假设我们有两个表:employees 和 salaries,分别用于存储公司员工信息和工资信息。

salaries表中包含字段emp_no作为外键,指向employees表中的emp_no字段,它们之间建立了一对多的关系,即一个员工可以有多条工资记录。

准备表结构

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`)
);

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`),
CONSTRAINT `salaries_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE
) ;

--清除干扰数据
DELETE FROM employees WHERE emp_no = 10011;

可以看到,在上述表结构中,我们在 salaries 表中定义了一个外键 emp_no,并将其与employees表中的 emp_no 字段进行外键约束。

 CONSTRAINT `salaries_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE

现在我们故意给工号为10011的员工新增一条工资信息,这个员工并不存在(上述测试SQL专门用一条DELETE语句确保此工号不存在)

示例1:插入数据时引用不存在的数据

请求报文

{
"jsonrpc": "2.0",
"method": "hrm.salaries.add",
"params": {
"empNo": "910011",
"salary": 3000,
"fromDate": "2023-09-01",
"toDate": "2023-09-30"
},
"id": "client-unique-request-id"
}

响应报文

{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "checking if the foreign key exists: foreign key constraint 'salaries_ibfk_1' fail in 'emp_no'",
"data": {
"errorCode": "EU.Constraint.FK.NotFound",
"errorDetails": [
{
"constraint": "ForeignKeyNotFound",
"field": "empNo",
"fieldValue": "910011",
"location": "hrm.salaries",
"message": "foreign key not found in hrm.salaries.{emp_no salaries_ibfk_1 hrm employees emp_no RESTRICT CASCADE} 910011"
}
],
"errorMessage": "foreign key constraint 'salaries_ibfk_1' fail in 'emp_no'"
}
},
"id": "client-unique-request-id"
}

系统会自动检查emp_no是否存在于employees表中,发现不存在,则提示外键约束失败,拒接插入该记录。

以上示例 Tested on Luwak 1.12.9

外键不可用的问题

阿里巴巴开发规范

分库分表导致外键约束失效