mysql 外键约束及表关联
一、MYSQL中的约束
1、主键:primary key 唯一非空的特性并且可以优化查询速度
2、外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性
3、唯一:unique
4、非空:not null
5、默认值:deafult
6、自增:auto_increment 设置了自增值每次自动增加1
二、外键的添加方式
1、方式一
create table 表名 (
字段名1 数据类型 约束,
字段名2 数据类型 约束,
。。。
constraint 外键名 foreign key(字段名) references 主表名(字段名) 级联操作);
方式2:表创建完成后添加外键
alter table 表名 add constraint 外键名 foreign key (字段1) references 表名2(字段名2)级联操作;
三、外键的注意事项
1、 两个表xiaodi和dage,如果xiaodi表中设置了外键关联了dage,那么我们把xiaodi表称为从表,dage表称为主表
2、 在建表的时候要现有主表,后有从表
3、 如果要删除数据表,那么需要先删从表,在删主表
4、 如果要向从表中插入数据,那么插入的数据必须是主表中存在的值,如果该值不存在,那么插入操作执行失败
5、 不可以对主表中的和从表有关联的数据直接进行删除,只有把从表的相关的数据先删除后再删除主表中的数据(即先删从表,再删主表)
6、 一个表中可以有多个外键,但是主键只能有一个
7、 外键通常关联的是主表的主键或者设置了unique的字段
8、 如果要使用外键,那么存储引擎不可以是myisam
9、 外键和外键关联的字段的数据类型要一致
一、查看外键:show create table 表名;
二、删除外键:alter table 表名 drop foreign key 外键名;
三、外键的级联操作
1、 on delete cascade:表示主表中的数据被删除后,从表中相关数据也会被删除
2、 on update cascade:表示主表中的数九被修改后,从表中的相关数据也会被修改
3、 on delete cascase on update cascase:表示删除和修改都有级联操作
4、 on delete set null:表示主表中的数据被删除后,从表中相关数据会被设置为null
5、 on update set null
6、 示例:

---------------------------------------------------------------------------------------------------------------------------------------------------------
一、什么是连接查询:就是将二个或二个以上的表,“连接起来”当做一个数据源,并从中去取得所须要的数据。连接查询包括交叉连接查询、内连接查询、外连接查询
(一) 交叉连接:交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积,返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
1、 格式1:select 要查询的内容 from 表名1 cross join 表名2;
2、 格式2:select 要查询的内容 from 表名1,表名2…;
3、 格式3:select 要查询的内容 from 表名1 join 表名2;
(二) 内连接:内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
1、 方法1:select 要查询的内容 from 表名1 inner join 表名2 on 表1.字段名=表2.字段名;
2、 方法2:select 要查询的内容 from 表名1 join 表名2 on 表1.字段名=表2.字段名;
3、 注意:在使用内连接时,可以给表起别名,格式为select 要查询的内容 from 表名1 别名1 join 表名2 别名2 on 别名1.字段名=别名2.字段名;
(三) 外链接:只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式,外连接分为左外连接、右外连接
1、 左外连接(以左表为主,即左表中的内容会全部显示出来,右表中不符合条件的部分用null补充):select 要查询的内容 from 表1 left join 表2 on 表1.字段名=表2.字段名;
2、 右外连接(以右表为主,即右表中的内容会全部显示出来,左表中不符合条件的部分用null补充)):select 要查询的内容 from 表1 right join 表2 on 表1.字段名=表2.字段名;
3、 习题:以product表和product_type表为例,查出每个品种各有多少个商品select a.protype_name, count(b.pro_name) from product_type a left join product b on a.protype_id = b.protype_id group by a.protype_name;
二、子查询:当一个查询是另一个查询的条件时,称之为子查询。子查询可以分为如下几类
(一) 按子查询结果分:表子查询、行子查询、列子查询、标量子查询
1、 表子查询:子查询的结果为多行多列,即一个表,该子查询通常放在from关键字后面
2、 行子查询:返回一行数据中多个列的内容
3、 列子查询:返回的结果为一列多行数据,此时可以当做“多个值”使用,类似:(5,17,8)
4、 标量子查询:返回的结果为一行一列,即一个值
(二) 按子查询所在位置分
1、 作为主查询的结果数据:select c1,(select f1 from tab2) as f11 from tab1;这里子查询应该是一个标量子查询
2、 作为主查询的条件数据:select c1 from tab1 where c1 in (select f1 from tab2);这里子查询应该是列子查询,即一列多行
3、 作为主查询的数据来源:select c1 from (select f1 as c1, f2 from tab2) as t2;这里子查询应该是表子查询
(三) 子查询之any、all关键字的使用
1、 any:表示大于集合中的任意一个值即可
1) 表1
2) 表2
3) 查询1:mysql> select * from tab2 where id>any (select f1 from tab3);
4) 查询2:mysql> select * from tab2 where id>all (select f1 from tab3);
(四) 子查询之exists关键字
mysql 外键约束及表关联的更多相关文章
- MySQL数据库(4)_MySQL数据库外键约束、表查询
一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- 1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- mysql外键约束总结
总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- Mysql外键约束--转载
链接:http://www.cnblogs.com/xuanan/p/7240923.html#undefined 一.外键约束 1.什么是外键? 外键指的是其他表中的主键,当做该表的外键. 2.创建 ...
- MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: ALTER TABLE tbl_name ADD [CON ...
- Mysql外键约束设置使用方法
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...
- mysql 外键约束
外键的定义语法:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col ...
随机推荐
- EmbeddedSolrServer的使用与solor6.3.0的使用
1. 到solr官网下载对应版本的solr: https://lucene.apache.org/solr/ 我下载的是:6.3.0版本(需要JDK8),solr默认集成了jetty容器,而且在 ...
- 7系列FPGA的时钟资源——UG472
时钟架构总览 7系的FPGA使用了专用的全局(Global)和区域(Regional)IO和时钟资源来管理设计中各种的时钟需求.Clock Management Tiles(CMT)提供了时钟合成(C ...
- 求逆序对常用的两种算法 ----归并排 & 树状数组
网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...
- 【原创】大叔问题定位分享(21)spark执行insert overwrite非常慢,比hive还要慢
最近把一些sql执行从hive改到spark,发现执行更慢,sql主要是一些insert overwrite操作,从执行计划看到,用到InsertIntoHiveTable spark-sql> ...
- windows下的node环境搭建
node环境的搭建过程: 1.首先在nodejs.org官网上下载一个msi安装文件,安装(过程很简单,基本上是一路next) 2.安装完成后,简单测试下是否安装成功,在cmd下输入两个命令: nod ...
- Emacs Org-mode 4 超连接
4.1 连接格式 连接的格式非常的简单,示例如下: [[文档内部锚点.外部连接][对连接的描述,可选]] 4.2 内部连接 想要引用或者连接到文档自身内的某个位置,需要引入另外一个概念:anchor( ...
- JS 判断传入的变量类型是否是Array
function f(arr){ 1.通过_proto_ 进行判断 (arr._proto_ 指向Array.prototype); 2.通过constructor进行判断 (arr.construc ...
- Win下必备神器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- Linux 上使用LVM 扩展磁盘Size
第一步:使用 fdisk -l 查看当前磁盘容量 fdisk -l 第二步: 使用 fdisk /dev/sda/ 为free space 添加新的分区 fdisk /dev/sda m :列出所有命 ...
- react + antd 实现打印功能(踩了不少坑)
最近在有网页打印需求,尝试了一下react的打印功能,遇到了不少的坑: 1.react本身有一些打印的组件,但都不好用,都是基于window.print(),但是window.print()如果直接打 ...