在MySQL中,外键约束是一种重要的数据库约束,用于确保表中的数据完整性。它强制子表中的每个记录都引用主表中的一个现有的记录,从而维护数据的一致性和完整性。
外键约束是作用于表中字段上的规则,用于限制存储在表中的数据。它使得两张表的数据之间能够建立连接,从而确保数据的一致性和完整性。
FOREIGN KEY
主表(父表):被引用的表,被参考的表
从表(子表):引用别人的表,参考别人的表
例如:员工表的员工所在部门这个字段的值要参考部门表:部门表是主表,员工表是从表。
例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是主表,选课表是从表。
手动
删除对应的索引
CREATE TABLE child_table (
child_column INT NOT NULL,
PRIMARY KEY (child_column),
FOREIGN KEY (child_column) REFERENCES parent_table (parent_column)
);
在上述语法中,child_table
是子表名称,parent_table
是主表名称,child_column
是子表中的外键列,parent_column
是主表中的引用列。
如果表已经存在,并且需要添加外键约束,可以使用ALTER TABLE
语句。例如:
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (child_column)
REFERENCES parent_table (parent_column);
其中,fk_name
是外键约束的名称,child_column
是子表中的外键列,parent_table
是主表名称,parent_column
是主表中的引用列。
如果不再需要外键约束,可以使用ALTER TABLE
语句将其删除。例如:
ALTER TABLE child_table
DROP FOREIGN KEY fk_name;
其中,child_table
是子表名称,fk_name
是要删除的外键约束的名称。
在MySQL中,外键约束的约束等级决定了当主表中的记录被更新或删除时,子表中相应的外键记录将如何响应。
在实际应用中,选择哪种约束等级取决于具体的业务需求。例如,如果希望当主表中的记录被删除时,子表中相应的记录也被删除,那么可以选择CASCADE约束等级。如果希望保留子表中的记录,但将外键字段设置为NULL以表示不再引用主表中的记录,那么可以选择SET NULL约束等级。
需要注意的是,外键约束的创建和使用需要满足一定的条件,如主表必须存在、主键必须定义、数据类型必须一致等。此外,不同的数据库管理系统(DBMS)可能对外键约束的支持和实现方式有所不同,因此在使用时需要参考具体DBMS的文档和指南。
ON DELETE CASCADE
选项来实现。ON UPDATE CASCADE
选项。假设有两个表:department
(部门表)和employee
(员工表)。我们希望确保每个员工都属于一个存在的部门,因此可以在employee
表中为dept_id
列添加外键约束,引用department
表中的id
列。
-- 创建部门表
CREATE TABLE department (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
-- 创建员工表并添加外键约束
CREATE TABLE employee (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
job VARCHAR(20),
salary INT,
dept_id INT,
PRIMARY KEY (id),
FOREIGN KEY (dept_id) REFERENCES department(id)
);
或者,如果员工表已经存在,可以使用ALTER TABLE
语句添加外键约束:
ALTER TABLE employee
ADD CONSTRAINT fk_employee_department
FOREIGN KEY (dept_id)
REFERENCES department(id);
这样,当尝试在employee
表中插入一个不存在的dept_id
时,数据库将拒绝该操作,从而保证了数据的一致性和完整性。
综上所述,外键约束在MySQL中扮演着重要的角色,它有助于维护数据库中的数据完整性和一致性。在使用外键约束时,需要确保满足其创建条件,并正确地创建和删除外键约束。
问题1:如果两个表之间有关系(一对一、一对多),比如:员工表和部门表(一对多),它们之间是否一定要建外键约束?
答:不是的
问题2:建和不建外键约束有什么区别?
答:建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。例如:在员工表中不可能添加一个员工信息,它的部门的值在部门表中找不到。
不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的引用完整性
,只能依靠程序员的自觉
,或者是在Java程序中进行限定
。例如:在员工表中,可以添加一个员工的信息,它的部门指定为一个完全不存在的部门。
问题3:那么建和不建外键约束和查询有没有关系?
答:没有
在 MySQL 里,外键约束是有成本的,需要消耗系统资源。对于大并发的 SQL 操作,有可能会不适合。比如大型网站的中央数据库,可能会
因为外键约束的系统开销而变得非常慢
。所以, MySQL 允许你不使用系统自带的外键约束,在应用层面
完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。
【强制
】不得使用外键与级联,一切外键概念必须在应用层解决。
说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发
,不适合分布式
、高并发集群
;级联更新是强阻塞,存在数据库更新风暴
的风险;外键影响数据库的插入速度
。