MySQL 外键

来源:互联网 发布:文件夹整理软件 编辑:程序博客网 时间:2024/04/29 02:14

补充:

Comment  ’注释内容’;

 

Set names gbk;客服端与服务器之间。

 

外键:

 

1.概念:

一个实体的某个字段指向另一个实体的主键,那么这个字段就是一个外键

其中,被指向的实体,叫做主实体(主表),也叫父实体(父表)

负责指向的实体,叫做从实体(从表),也叫子实体(子表)

 

2.作用:

用于约束处于关系内的实体。

增加子表记录时,是否有与之对应的父表记录。

在删除或者更新主表记录时 ,从表该如何处理相关的记录。

 

3.语法:

Foreign key(外键字段)references表名 (主键字段)

子表建立字段指向父表主键。

 

4.设置级联操作(关联动作):

在主表数据发生改变时,与之关联的从表数据应该如何处理:

主表更新:On update

主表删除:On delete

允许级联动作:

Cascade :执行同联操作,如果主表被更新或者删除,那么从表也会执行相应的操作。

Set null :设置为null,表示从表不指向任何主表记录。

Restrict :拒绝主表的相关操作。

 

修改外键,必须先删除,再重新创建。

Ater table 表名 drop foreign key字段

删除外键需要通过指定完整的外键名称来达到目的:

可以通过在创建外键时,指定名称,

后者通过show create table 表名

来找到约束外键名称CONSTRAINT完整的外键名称’;

 

注意:此时删除的是约束条件,原本从表中的数据并不发生改变。

 

Ater table 表名 add foreign key字段

 

注意:此时新建的也是约束条件,原本从表中的数据并不发生改变。

 

 

 

 

On delete set null;删除时,将从表的外键值设置为null

On delete cascade;删除时,从表的整条记录也将被删除;

On update ; 指的是,只有主表的主键发生变化,才会对从表产生反应;

On update restrict ;拒绝修改主表。

 

高级数据库管理员才使用,一般项目都不使用外键。


create table itcast_class(class_id int primary key auto_increment,class_name varchar(10) not null default '' comment '班级姓名')character set utf8;create table itcast_student(stu_id int primary key auto_increment,stu_name varchar(10),class_id int ,foreign key (class_id) references itcast_class (class_id))character set utf8;insert into itcast_student values (null,'Mike',1);/*Cannot add or update a child row: a foreign key constraint fails (`php_one`.`itcast_student`, CONSTRAINT `itcast_student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `itcast_class` (`class_id`))没有新建class_id 为1 的班级,因此没有对应找到相应的班级。*/insert into itcast_class values(null,'php0331');insert into itcast_student values (null,'Mike',1);/*成功*/select * from itcast_student;/*对foreign的修改*/show create table itcast_student;alter table itcast_student drop foreign key itcast_student_ibfk_1; /*删除外键-完整的外键名称*/show create table itcast_student\G;  /*约束字段消失*/alter table itcast_student add foreign key (class_id) references itcast_class (class_id)on delete set null;select * from itcast_class;select * from itcast_student;delete from itcast_class where class_id=1;select * from itcast_class;                 /*主表为empty*/select * from itcast_student;               /*class_id 为null,前提是class_id可以为null*//*先维护数据*/alter table itcast_student drop foreign key itcast_student_ibfk_1; show create table itcast_student\G;alter table itcast_student add foreign key (class_id) references itcast_class (class_id)on delete cascade;delete from itcast_class where class_id=1;select * from itcast_class;               /*主表为empty*/select * from itcast_student;             /*从表为empty*//*先维护数据*/alter table itcast_student drop foreign key itcast_student_ibfk_1; show create table itcast_student\G;alter table itcast_student add foreign key (class_id) references itcast_class (class_id)on delete cascadeon update restrict;update itcast_class set class_id=1 where class_name='php0331'; /*有限制restrict,无法更新*/


0 0