补充:
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 cascade
on update restrict;
update itcast_class set class_id=1 where class_name='php0331'; /*有限制restrict,无法更新*/