一、外键
1、外键:foreign key。如果一张表中有一个字段(非主键)指向另外一张表的主键,将该字段称为外键
注:外键必须指向另外一张表,即 和另外一张表产生联系
2、关系型数据库有两种约束,一种是约束实体内部字段与字段之间的关系,一种是约束实体与实体之间的关系(用外键来控制)
3、一张表可以有多个外键
4、增加外键
(1)外键可以在创建表的时候或者创建表之后增加
(2)在创建表的时候增加外键:在所有的表字段之后,使用"foreign key(外键字段) references 外部表(主键字段)"
注:创建表时增加外键只有一种方法,就是在所有字段之后增加外键。不能直接在外键字段后面加"foreign key references 外部表(主键字段)"
-- 在创建表的时候增加外键
create table my_foreign1(
id int primary key auto_increment,
name varchar(20) not null comment '学生姓名',
c_id int comment '班级id', -- 普通字段
-- 增加外键
foreign key(c_id) references my_class(id)
)charset utf8;
-- 查看表结构
desc my_foreign1;
-- 查看表创建语句
show create table my_foreign1;
注:外键要求字段本身必须先是一个索引(普通索引)。如果字段本身没有索引,外键会先创建一个索引,然后才会创建外键本身
(3)在创建表之后增加外键:修改表结构
注:
a). 外键字段本身要先在表中存在,否则增加外键时会报错
b). 外键名字必须未被使用过,其他表也没有使用过才可以。所以,使用默认的外键名比较靠谱???
-- 在创建表之后增加外键:修改表结构
-- 外键字段本身要先存在
-- 外键名字必须未被使用过,其他表也没有使用过才可以
alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 外部表(主键字段);
-- 创建表
create table my_foreign2(
id int primary key auto_increment,
name varchar(20) not null comment '学生姓名',
c_id int comment '班级id' -- 普通字段
)charset utf8;
-- 查看表结构
desc my_foreign2;
-- 增加外键(在创建表之后增加外键:修改表结构)
alter table my_foreign2 add constraint student_class_1 foreign key(c_id) references my_class(id);
-- 查看表结构
desc my_foreign2;
-- 查看表创建语句
-- 外键名字是"[constraint 外键名字]"中定义的"student_class_1"
show create table my_foreign2;
5、修改外键&删除外键
(1)外键不可修改,只能先删除后新增
&