zoukankan      html  css  js  c++  java
  • 20150102--Mysql外键+增删改查-02

    外键

    外键:外面的键,前表中的某个字段与另外的表中的字段(主键)有一个对应的关系

    外键关键字:foreign key,也是一种索引。

    创建外键

    外键和主键有点类似,但是不一样。

    clip_image001

    1. clip_image002在所有的字段之后,指定对应的外键。

    foreign key(字段名) references 表名(字段)

    clip_image003clip_image004clip_image006

    外键约束

    外键的作用是用来维护两张表之间的关系,关系是用来限制表操作的。

    父表(主表):被外键指向的表叫做主表

    子表(从表):存在外键字段的表叫子表

    1. 限制子表数据的插入:子表中的外键字段的值必须事先已经在父表中存在

    clip_image008

    2. 限制父表对数据进行操作:更新和删除,限制指的是对应主键的修改。

    clip_image010

    修改外键:外键不能被直接修改,应当先删除后新增

    删除外键

    alter table 表名 drop foreign key 外键名;

    clip_image012

    clip_image013新增外键

    clip_image014修改表结构

    alter table 表名 add constraint 外键名 foreign key(字段) references 表名(字段);

    clip_image016

    约束模式

    用户可以根据自身的需求对外键采用不同的约束方式

    有三种约束模式

    严格模式:restrict,严格约束外键对应的表

    置空模式:set null,将一个外键对应的字段数据给变成null,当父表数据改变的时候,子表的数据被设置成null

    级联模式:cascade,级联操作,当父表数据被改变的时候,子表跟着改变

    语法

    foreign key(字段) references 表(字段) on delete 约束模式 on upldate 约束模式

    通常的约束模式:on update cascade on delete set null

    clip_image018

    更新父表

    clip_image020

    删除父表数据

    clip_image022

    外键条件

    1. 外键表和被引用的表(父子表)都应该是InnoDB的存储引擎

    2. 外键字段和被引用的主键字段,必须数据类型完全一致

    3. 外键的名字必须具有唯一性

    4. 外键可以在一张表中创建多个

    5. 如果要使用约束模式:置空模式,必须保证子表对应的外键字段本身允许为空

    clip_image024

    高级数据操作

    新增数据

    标准语法

    insert into 表名 (字段列表) values(值列表);

    蠕虫复制

    从一个已有的数据中获取数据,然后将数据插入到对应数据表中。

    insert into 表名 (字段列表) select 字段列表 from 表名;

    clip_image026

    蠕虫复制的作用

    1. 短时间内迅速增加表中的数据(意义不大),测试数据表的压力

    2. 从表中去复制数据

    a) 复制表结构:create table 表名 like 已经存在的表;

    clip_image028

    b) 蠕虫复制数据

    clip_image030

    主键冲突

    主键冲突指的是当数据进行插入操作的时候,如果主键冲突了该怎么办。

    解决方案1:如果主键冲突,执行更新操作,没有冲突直接插入

    insert into 表名 values (值列表) on duplicate key update 字段 = 值[,字段 = 值]

    clip_image032

    解决方案2:如果主键冲突,先删除,后新增

    replace into 表名 values(值列表);

    clip_image034

    删除数据

    标准语法

    delete from 表名 where条件;

    高级语法

    delete from 表名 where条件 [order by排序] [limit 数值]; -- 排序后删除指定条数数据

    clip_image036

    truncate语法:清空表包括对应的自动增长:先删除表,后新增表

    clip_image038

    更新数据

    与高级的删除数据一样:利用排序和限制

    update 表名 set 字段 =值 where条件 order by字段 limit 数值;

    查询数据

    标准语法

    select 字段列表/* from 表名 where条件;

    完整语法

    select 选择模式 表达式[字段列表(别名)/*] [from 子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句]

    选择模式

    选择模式指的是当select查到数据之后,对数据的处理方式:查询全部(默认的all),去重(去掉重复的:记录重复,distinct)

    clip_image039clip_image040clip_image042

    表达式

    select指定的要返回数据形式

    通常要查询的数据,都是字段列表或者*(全部字段),有时候会因为同时查询多个表而出现字段重名的问题。需要使用字段别名来决绝问题。

    语法:字段 [as] 别名

    clip_image044

    别名不能真正改变字段名。

    from子句

    from子句指 的是数据源

    from后面必须接数据源,数据源不一定是一张表

    1. from后面可以跟多张表,使用逗号分隔

    clip_image046

    笛卡尔积没有意义:应当尽量避免。

    2. 表别名

    clip_image048

    3. 数据源不一定是一张已经存在的表,需要的只是一个二维表的结构。from后面可以跟一个子查询。

    clip_image050

    4. 虚拟表

    一个不存在的表:dual,凡是没有数据源的select语句都可以为了保证语法的完整性,而增加from子句,数据源是dual

    clip_image052

    where子句

    where子句用于筛选条件,对数据(记录)进行逐行判断,返回是一个类似布尔的结果。

    clip_image054

    where原理

    clip_image056

    只有where操作的时候,是直接在磁盘上对数据进行判断,where之后的所有子句都是对内存中的数据进行操作

    补充知识

    mysql中没有布尔类型,但是却“支持”布尔类型,是内部会进行数据转换,识别关键字

    clip_image058

    where判断:返回的结果是布尔类型

    比较运算:=,>,>=,<,<=,between 左边较小 and 较大,in,is null/is not null

    clip_image060

    逻辑运算:&&and和||or,用于多条件联合判断

    模糊匹配:like ‘patter’,匹配符:%和_

  • 相关阅读:
    函数调用栈的总结
    Calling convention-调用约定
    函数可以返回结构体的原因
    pthread_join/pthread_exit的用法解析
    线程退出的几种方式和资源回收【线程编程中避免内存泄漏】
    线程状态与tcb、线程的生命周期
    pthread_cleanup_push vs Autorelease VS 异常处理
    thread.h
    Thread Control Block
    线程与cpu
  • 原文地址:https://www.cnblogs.com/lifushan/p/5414725.html
Copyright © 2011-2022 走看看