MySQL (六)

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 联合查询

  

时间: 2024-10-22 11:19:41

MySQL (六)的相关文章

Zabbix 3.0 监控MySQL [六]

Zabbix 3.0 监控MySQL [六] 2016年10月9日18:25:29 zabbix 笔者QQ:381493251 博客地址:www.abcdocker.com 微信公众号:abcdocker Abcdocker交流群:454666672 如果遇到什么问题可以进群询问,我们是一个乐于帮助的集体! Mysql监控 zabbix自带了一个监控mysql的模板,但是真正监控mysql的并不是zabbix自带的模板.而是percona公司的一个监控mysql模板 percona官网: www

MySQL六:索引原理与慢查询优化

阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 三 MySQL索引管理 四 测试索引 五 正确使用索引 六 查询优化神器-explain 七 慢查询优化的基本步骤 八 慢日志管理 九 参考博客 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 什么是索引? 索引在MySQL中也叫做"

mysql六:数据备份、pymysql模块

阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 #6. 备份库/表 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键 二 MySQL数据备份

Mysql(六):数据备份、pymysql模块

一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 #6. 备份库/表 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键 二 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异

mysql(六)

MySQL用户和权限管理 库和表级别:TABLE or DATABASE ALTER CREATE CREATE VIEW DROP INDEX SHOW VIEW GRANT OPTION:能够把自己获得的权限赠经其他用户一个副本: 数据操作: SELECT INSERT DELETE UPDATE 字段级别: SELECT(col1,col2,...) UPDATE(col1,col2,...) INSERT(col1,col2,...) 所有有限:ALL PRIVILEGES, ALL 元

MySQL(六) —— 自定义函数

自定义函数 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 参数,返回值 创建自定义函数 CREATE FUNCTION function_name RETURNS [STRING|INTEGER|REAL|DECIMAL] routine_body //关于函数体 //1. 函数体有合法的SQL语句构成: //2. 函数体可以是简单的SELECT或INSERT语句: //3. 函数体如果为符合结构则使用BEGIN..E

zabbix2.2入门教程之监控mysql(六)

zabbix2.2自带了监控mysql的模版,我们可以使用自带的模版来监控mysql,如果模版不能满足我们的需求,我们可以再自定义key来达到我们的需求,接下来就讲下如何使用zabbix自带模版监控mysql状态 首先先授权让zabbix连接数据库 mysql>grant USAGE on *.* to 'zabbix'@'localhost' identified by 'zabbix'; 接下来建立数据库连接信息文件/usr/local/zabbix/etc/.my.cnf [mysql]

mysql<六>

-- ########## 01.综合练习 ########## -- 使用的表结构来自前面创建的"教师授课.学生选课并有课程成绩"这个数据库设计 -- studentinfo.teacherinfo.courseinfo.scoreinfo -- 1.查询姓张的老师的数量 SELECT COUNT(teacherid) AS 姓张的老师的数量 FROM teacherinfo WHERE teachername LIKE '张%'; -- 2.查询每门功课选修的学生数量 -- 写法1

一.Mysql主从复制配置

在我之前的文章四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码安装 和 九.mysql数据库多实例安装mysqld_multi [start,stop,report] 两篇文章写到了单太服务器多实例的安装,本篇文章是关于主从复制的配置.本次把mysql3306作为主Master,mysql3307和mysql3308作为Slave 一.启动3台mysql服务器 [[email protected] ~]$ mysqld_multi

MySQL 5.7.9源码编译安装说明

一.环境说明 1.操作系统 系统版本:RHEL 6.3 X64 操作系统安装类型:Basic 系统安装包:gcc gcc-c++ bzip2(default) bzip2-devel bzip2-libs(default) python-devel ncurses-devel bison 1)gcc gcc-c++ [[email protected] Packages]# rpm -ivh kernel-headers-2.6.32-279.el6.x86_64.rpm warning: ke