版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、外键约束
外键,是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束;外键用于建立两张表之间的连接,为了更好的理解外键的定义和作用,我们通过例子来学习吧,首先看下面两张表:
CREATE TABLE student(
s_id varchar(50) NOT NULL PRIMARY KEY,
s_name varchar(50) NOT NULL,
s_gender varchar(50)
)
CREATE TABLE family(
f_id varchar(50) NOT NULL PRIMARY KEY,
s_id varchar(50) NOT NULL,
f_name varchar(50) NOT NULL,
f_relationship varchar(50)
)
family表中的s_id列表示是属于哪位学生的家庭成员,该值必须是student表中的s_id值,这种情况下,学生(student)表被称为主表,家庭(family)表被称为从表。所以,我们可以利用外键(FOREIGN KEY)将family表中的s_id和student表中的s_id建立起联系,代码如下:
1、基本语法
创建表(CREATE TABLE)时的外键(FOREIGN KEY)约束
MySQL数据库中的语法如下:
CREATE TABLE family(
f_id varchar(50) NOT NULL,
s_id varchar(50) NOT NULL,
f_name varchar(50) NOT NULL,
f_relationship varchar(50),
PRIMARY KEY (f_id),
FOREIGN KEY (s_id) REFERENCES student (s_id)
)
SQL Server / Oracle / MS Access数据库中的语法如下:
CREATE TABLE family(
f_id varchar(50) NOT NULL PRIMARY KEY,
s_id varchar(50) NOT NULL FOREIGN KEY REFERENCES student(s_id),
f_name varchar(50) NOT NULL,
f_relationship varchar(50),
)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束则可使用下面的语法(MySQL / SQL Server / Oracle / MS Access):
CREATE TABLE family(
f_id varchar(50) NOT NULL,
s_id varchar(50) NOT NULL,
f_name varchar(50) NOT NULL,
f_relationship varchar(50),
PRIMARY KEY (f_id),
CONSTRAINT fk_name FOREIGN KEY (s_id) REFERENCES student (s_id)
)
修改表(ALTER TABLE)时的外键(FOREIGN KEY)约束
当表已被创建时,如需在某一列创建 FOREIGN KEY 约束则可使用下面的语法(MySQL / SQL Server / Oracle / MS Access):
ALTER TABLE table_name
ADD FOREIGN KEY (column_name)
REFERENCES table_name(column_name)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束则可用下面的语法(MySQL / SQL Server / Oracle / MS Access):
ALTER TABLE table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES table_name(column_name)
撤销外键(FOREIGN KEY)约束
在MySQL数据库中撤销外键(FOREIGN KEY)约束使用下面的语法:
ALTER TABLE table_name
DROP FOREIGN KEY fk_name
在SQL Server / Oracle / MS Access数据库中撤销外键(FOREIGN KEY)约束使用下面的语法:
ALTER TABLE table_name
DROP CONSTRAINT fk_name
小结:
- 从表里的外键通常为主表的主键
- 从表里外键的数据类型必须与主表中主键的数据类型一致
- 主表发生变化时应注意主表与从表的数据一致性问题