什么是外键
在关系型数据库中,一个表(称作子表或从表)的字段,可以参考另外一个表中的主键(称作主表或父表)的字段,这种字段就是外键。
可以理解为,一个表的外键字段指向另外一个表的主键字段,这样就可以在两个表之间建立关系。通过这个关系,可以方便地进行查询和操作。
如何设置外键
创建表时设置外键
在创建表时,可以通过约束的方式来设置外键。创建表语句如下:
CREATE TABLE t_goods (
id INT PRIMARY KEY,
goods_name VARCHAR(20),
category_id INT,
FOREIGN KEY (category_id) REFERENCES t_category(id)
);
CREATE TABLE t_category (
id INT PRIMARY KEY,
category_name VARCHAR(20)
);
以上的代码中,t_goods表中的category_id字段为外键,参考了t_category表中的id字段。关联的sql语句是:FOREIGN KEY (category_id) REFERENCES t_category(id)。
这种方式可以保证插入数据时,category_id的取值只能是t_category表中已存在的id值(否则会报错)。
已存在的表中添加外键
在已经存在的表中添加外键,必须满足两个表中的对应字段类型、长度等必须相同,同时字段名也必须一致。在MySQL中,可以通过修改表结构来添加外键。
例如,在t_goods表中添加外键,关联t_category表:
ALTER TABLE t_goods ADD FOREIGN KEY (category_id) REFERENCES t_category(id);
这条语句的含义是:将t_goods表的category_id字段设置为外键,并参考t_category表的id字段。
需要注意的是,已经存在的数据的category_id值,必须与t_category表中id字段的值一致,否则也会报错。
外键的作用
外键可以用来保证数据的引用关系的正确性。
例如,t_goods表中的category_id字段参考t_category表中的id字段。这样,在插入t_goods表数据时,如果插入的数据的category_id在t_category表中不存在,就会报错,保证数据的正确性。
同时,外键还可以用来实现相关的查询,以及级联更新和级联删除等功能。
外键的类型
MySQL中的外键有两种类型:普通外键和唯一外键。
普通外键即前面介绍的,在创建表或者修改表结构时设置的外键。
唯一外键则是指一个表中的字段不仅唯一,同时还满足参考其他表的主键的要求。在MySQL中,可以通过给字段加上UNIQUE和FOREIGN KEY约束来实现唯一外键。例如:
CREATE TABLE t_users (
id INT PRIMARY KEY,
name VARCHAR(20) UNIQUE,
city_id INT,
FOREIGN KEY (city_id) REFERENCES t_cities(id)
);
CREATE TABLE t_cities (
id INT PRIMARY KEY,
city_name VARCHAR(20)
);
以上代码中,t_users表中的name字段加上了UNIQUE约束,变为唯一外键。
外键的优缺点
优点
保证数据的引用关系的正确性。
提供相关的查询功能。
提供级联更新和级联删除等功能。
缺点
外键的查询和操作效率较低。
外键会限制数据的修改和删除操作,增加了维护的复杂度。
外键的约束可能会造成死锁等问题。
总结
外键是关系型数据库中一个重要的概念,它可以用来保证数据的引用关系的正确性,提供相关的查询和操作功能。在MySQL中,外键分为普通外键和唯一外键两种类型。外键的设置有助于数据的完整性和一致性维护,但同时也会带来一些约束和限制。