码迷,mamicode.com
首页 > 数据库 > 详细

MySQL (六)

时间:2017-08-24 01:14:36      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:mysql   cad   没有   date   一个   表的操作   联合查询   mysq   varchar   

1 外键

  • 外键:foreign key,外面的键(键不在自己表中),如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称为外键。

 

1.1 增加外键

  • 外键可以在创建表的时候或创建表之后增加(但是要考虑数据的问题)。

 

  • 方案一:在创建表的时候增加外键,在所有的表字段之后,使用foreign key(外键字段) references 外部表 (主键字段);
-- 创建班级
CREATE TABLE my_class(
    id INT PRIMARY KEY AUTO_INCREMENT,
    c_name VARCHAR(20) NOT NULL,
    room VARCHAR(20)
);
-- 创建学生表
CREATE TABLE my_student1(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20) NOT NULL,
    c_id INT ,
    CONSTRAINT fk_c_id FOREIGN KEY (c_id) REFERENCES my_class (id)
);

技术分享

技术分享

 

  • 方案二:在新增表之后,增加外键,所以需要修改表结构。
alter table 表名 add [constraint 外键名字] foreign key (外键字段) references 父表(主键字段);
-- 创建班级
CREATE TABLE my_class(
    id INT PRIMARY KEY AUTO_INCREMENT,
    c_name VARCHAR(20) NOT NULL,
    room VARCHAR(20)
);
-- 创建学生表
CREATE TABLE my_student2(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20) NOT NULL,
    c_id INT 
);
ALTER TABLE my_student2 ADD CONSTRAINT fk_c_id FOREIGN KEY (c_id) REFERENCES my_class (id);

技术分享

技术分享

 

1.2 修改外键&删除外键

  •  外键不可以修改:只能先删除后新增。
alter table 表名 drop foreign key 外键名;--一张表中可以有多个外键,但是名字不能相同
ALTER TABLE my_student2 DROP FOREIGN KEY fk_c_id;

技术分享

 

1.3 外键作用

  • 外键默认的作用有两点:
    • 一个对父表:父表数据进行写操作(删和改,都必须设计到主键本身),如果对应的主键在字表中已经被数据所引用,那么就不允许操作。
    • 一个对字表(外键字段所在的表):字表数据进行写操作(增和改)的时候,如果对应的外键字段在父表找不到对应的匹配,操作会失败。  

 

1.4 外键条件

  • 外键要存在:首先必须表的存储引擎是innodb。如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果。
  • 外键字段的字段类型(列类型)必须和父表的主键类型完全一致。
  • 一张表中的外键名字不能重复。
  • 增加外键的字段(数据已经存在),必须保证数据和父表主键要求对应。

 

1.5 外键约束

  • 外键约束:就是外键的作用。

 

  • 外键约束有三种约束模式:都是针对父表的约束
    • district:严格模式(默认的),父表不能删除或更新一个已经被子表数据引用的记录(主键)。
    • cascade:级联模式,父表的操作,对应子表关联的数据也随之变化。
    • set null:置空模式,父表的操作之后,子表对应的数据(外键)被置空。  
  • 通常:父表删除的时候,子表置空;更新的时候,子表级联操作。
constraint 外键名字 foreign key (外键字段) references 主表(主键) on delete set null;
constraint 外键名字 foreign key (外键字段) references 主表(主键) on update cascade;
constraint 外键名字 foreign key (外键字段) references 主表(主键) on delete set null on update cascade;

 

  • 删除置空的前提:外键字段为空(如果不满足条件,外键无法创建)。

 

  • 外键虽然很强大,能够进行各种约束,但是对于java来说,外键约束降低了java对数据的可控性。所以,通常情况下,在实际开发中,很少使用外键的级联模式和置空模式。

 

2 联合查询

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

MySQL (六)

标签:mysql   cad   没有   date   一个   表的操作   联合查询   mysq   varchar   

原文地址:http://www.cnblogs.com/xuweiweiailixing/p/7420976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!