mysql外键,学的时候一笔带过,只知道myisam不支持外键,innodb引擎支持外键,并且知道myisam引擎可能速度更快一点,但在大数据面前,二者差异不大,但始终不明白外键到底是什么玩意,这两天专门看了下,顺带温习了下ddl和dml。  mysql里提到外键,那就是和主键相对的。主表是主键(唯一标识),从表可以设立外键(foreign key),建立一个和主表的一个联系(关系),从表的外键就是这两个数据表的连接所在。外键有三种关系:级联(cascade)、 制空(set null)、禁止(no action/restrict)。主表和从表都要是innodb引擎才行。

首先建立一个主表,因为不论你设置什么类型的外键,主表都是一样的,外键在从表里面设置

create table zhubiao(  id int not null primary key auto_increment,  name char(20) default '主表数据'  )engine=innodb charset=utf8;  先在主表中插入两条数据供从表调用

insert into zhubiao(name)values('梅西');--这条数据的id是1(自增的)insert into zhubiao(name)values('C罗');--那么这条数据的id就是2(自增的)一:级联关系(cascade):从表的数据跟随主表的变化而变化,从表的数据随主表的改变而改变。删除和更改主表,从表受影响,而动从表,只要在(外键值)范围内主表不受影响,在范围外(外键范围),无法删改从表

CREATE TABLE congbiao(  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,  zid INT,  name VARCHAR( 20 ) ,  FOREIGN KEY ( zid ) REFERENCES zhubiao( id ) ON DELETE CASCADE ON UPDATE CASCADE  ) ENGINE = INNODB CHARSET = utf8;从表的结构,zid关联主表的id,zid是外键(搞外部关联的键),references也是关键字,可以理解为关联的意思,on delete cascade 就是删除时候执行(关联),此时插入几条数据实验。

主表已有两条数据,id分别是1和2.,下面插入从表一些数据

insert into zhubiao(zid,name)values(1,'第一');--此时zid=1,则对应主表的梅西。insert into zhubiao(zid,name)values(2,'第二');--此时zid=2,则对应主表的C罗。insert into zhubiao(zid,name)values(3,'第三');--此时zid=3,因为主表中并没有id=3的数据,所以插入从表的本条数据插入失败。cascade以主表为主  下面做删除实验

delete from zhubiao where id=1;--主表中id=1的梅西删除了,则从表中对应的zid=1的‘第一’这条数据也会被删除 下面做update实验

update zhubiao set id=22 where id=2;--把主表的C罗的id从2改成了22,则从表对应的外键值也跟着改动,此时从表的‘第二’那条数据的zid被改成了22;二:制空(set null);还是以主表为主,从表外键关联后,再双方都有数据后,主表的那个外键对应的字段如果改变(删改)了,从表对应的那条数据的外键为null

create table congbiao(zid int,  name varchar(20) default '球星',  foreign key(zid) references zhubiao(id) on delete set null on update set null  )engine=innodb charset=utf8;建表完成,此时外键对应的主表的字段如果改变,从表的外键对应的字段则被设置为null.

先给从表插入几条数据

insert into congbiao(zid,name)values(1,'足球'); insert into congbiao(zid,name)values(2,'蓝球');insert into congbiao(zid,name)values(3,'乒乓球');--插入失败,不论哪种外键类型,外键的值都必须是主表对应字段的取值之内,也就是说外键取的值,主表要有才行然后进行delete和update实验

update zhubiao set id=11 where id=1;--主表的id(从表的外键)改变,则从表对应的zid的‘足球’那条数据的zid被设置为了nulldelete from zhubiao where id=2;--从表中的‘篮球’这条数据的zid被设置成了null三:禁止模式(no action)这个模式以从表为主,就是当两边都有数据后,主表里如果要删除或更改一条数据,如过从表里有对应的数据,则主表不允许更改或删除,要先删除从表里对应的数据,主表里的数据才可以动。

create table congbiao(zid int,  name char(10),  foreign key(zid) references zhubiao(id) on delete no action on update no action)engine=innodb charset=utf8;  从表建立完成,此时主表可以随便插入,从表在外键范围内也可以随意插入,但从表一旦插入数据后,主表如果想修改外键字段,如果这条数据有外键相连,则修改(删除)失败

insert into congbiao(zid,name)values(1,'足球');  insert into congbiao(zid,name)values(2,'蓝球'); 然后进行delete和update实验

delete from zhubiao where id=1;--删除失败,因为从表有外键=1的数据  update zhubiao set id=22 where id=2;--修改失败,因为从表有外键=2的数据 要想删除或者修改从表中已有的主表数据,需要先删除(只能删除,修改会失败的。)这条数据,这样从表的外键与主表的字段数值就没有联系了,就可以删改主表数据了。例如吧足球这条数据删了。这样主表的id=1的字段就可以删改了。

mysql外键的三种模式,就是这样了。需要注意一点:无论哪种模式,从表不能insert/update主表外键(值)范围之外的数据用处嘛我个人觉得一三可能会用的比较多,级联方式用的会比较多,比如学生信息表和学生成绩表,用级联的话,学生信息表里删除了这个学生,则这个学生的成绩也会自动在学生成绩表里被删除,而如果学号(外键)变了,则学生成绩表里的学号跟着变,有了外键会省去很多操作。而禁止模式,可能会针对一些比较重要的数据表用,主要是禁止主表修改和删除,比如身份证号。。设置了之后,从表里面有名字和号码,而身份号是不允许改动的。但名字可以改。 mysql的外键知识告一段落,今天给技术笔记开个头.