在 MySQL 中,外键 (Foreign Key) 是一种用于定义表与表之间关联的约束,用来确保数据库中的数据一致性和完整性。外键约束帮助确保一个表中的某列值(外键)对应到另一个表中某个列的值(主键或唯一键)。
外键的基本概念主表 (Parent Table):存储主键的表,外键指向主表。外键表 (Child Table):存储外键的表,外键约束在这个表中定义。外键约束 (Foreign Key Constraint):规定外键列中的值必须与主表中的值匹配,确保数据的一致性。外键的作用数据完整性:外键确保了子表中的数据必须有父表中对应的值,避免了脏数据的插入。级联操作:外键支持级联操作,如级联删除(CASCADE)或级联更新(CASCADE),确保相关数据的自动更新或删除。创建外键约束1. 创建表时定义外键创建表时,可以通过 FOREIGN KEY 关键字来定义外键约束。
代码语言:javascript复制CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id));php152 Bytes© 菜鸟-创作你的创作orders 表中,customer_id 列是外键,指向 customers 表的 customer_id 列。REFERENCES 后面是目标表和列。2. 创建外键时指定约束名称你也可以给外键约束命名,方便管理和调试。
代码语言:javascript复制CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id));php175 Bytes© 菜鸟-创作你的创作这里 fk_customer 是外键约束的名称。
3. 添加外键到已有表中如果表已经创建,你也可以通过 ALTER TABLE 语句来添加外键约束。
代码语言:javascript复制ALTER TABLE ordersADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id);php106 Bytes© 菜鸟-创作你的创作外键的约束选项在定义外键时,可以使用以下几种约束选项来控制外键的行为:
ON DELETE:指定删除父表数据时,子表数据的处理方式。CASCADE:删除父表数据时,自动删除子表中与之相关的数据。SET NULL:删除父表数据时,将子表中相关的数据设置为 NULL。RESTRICT:不允许删除父表数据,如果有子表数据依赖于该父表数据。NO ACTION:与 RESTRICT 相同,但不同的是,NO ACTION 在查询时不会有显式限制。SET DEFAULT:如果父表数据被删除,子表中的外键字段将被设置为其默认值。ON UPDATE:指定更新父表数据时,子表数据的处理方式。与 ON DELETE 选项类似,支持 CASCADE、SET NULL、RESTRICT、NO ACTION 等。示例代码语言:javascript复制CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE ON UPDATE CASCADE);php223 Bytes© 菜鸟-创作你的创作在这个例子中,ON DELETE CASCADE 表示删除父表 customers 中某个客户时,所有相关的订单也会被自动删除。ON UPDATE CASCADE 表示如果 customers 表中的 customer_id 被更新,orders 表中所有相关的 customer_id 也会自动更新。外键约束的基本要求数据类型一致性:外键列的数据类型必须与目标列的数据类型完全一致(包括长度、类型、符号等)。索引要求:外键列必须有索引。在创建外键约束时,MySQL 会自动为外键列创建一个索引。如果外键列已经有索引,则不会创建重复的索引。唯一性:外键引用的列必须是父表的主键或具有唯一约束的列。同源性:如果两个表属于同一个数据库,则可以创建外键约束。如果要在不同数据库之间设置外键约束,MySQL 并不支持。外键的约束冲突在执行插入、更新或删除操作时,如果违反外键约束,会抛出错误。例如:
如果尝试插入一个 customer_id 为 999 的订单,但 customers 表中并没有这个 customer_id,MySQL 会报错。如果尝试删除 customers 表中某个有相关订单的客户,并且外键约束设置为 RESTRICT 或 NO ACTION,则会阻止删除。查看和删除外键约束查看外键约束:
你可以使用以下命令来查看某个表的外键约束。SHOW CREATE TABLE orders; 这会显示 orders 表的创建语句,包括所有外键约束。删除外键约束:
如果需要删除外键约束,可以使用 ALTER TABLE 语句。ALTER TABLE orders DROP FOREIGN KEY fk_customer; 这里 fk_customer 是你在创建外键时为约束命名的名字。外键约束的优缺点优点数据一致性:保证了表之间的数据关联性和一致性。自动维护:通过级联删除和更新,可以自动维护父子表之间的关系,减少了手动处理数据的复杂度。缺点性能开销:外键约束需要额外的计算和检查,在插入、更新或删除数据时可能会产生性能开销。锁定问题:外键约束可能会导致表锁定问题,影响并发性能。小结外键是用于表之间建立联系的强有力工具,能够保证数据的完整性和一致性。在 MySQL 中,外键约束是通过 FOREIGN KEY 来定义的,并且可以设置如 ON DELETE 和 ON UPDATE 等行为选项。外键约束需要满足一些基本的要求,如数据类型一致性和索引要求。外键在增强数据一致性的同时,也可能带来性能问题,因此在设计数据库时要根据实际需求权衡使用。如果你有更具体的需求或案例,欢迎进一步交流!
https://www.52runoob.com/archives/3924