您的位置:首页 > 数据库 > MySQL

MySQL 学习教程(六)【整理】-主键冲突/ 蠕虫复制/ 更新/ 删除

2017-11-06 07:47 726 查看
注: 参考自 http://blog.csdn.net/qq_35246620/article/details/70823903

一、主键冲突

数据的操作,无外乎增删改查

新增数据的基本语法为:

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


在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突。

当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即更新或替换。

下面,以表
my_class
为例,进行测试:



其中,
grade
为主键。

1. 第一种情况:主键冲突,进行更新操作。

基本语法:
insert into + 表名 + [(字段列表:包含主键)] + values (值列表) on duplicate key update 字段 = 新值;


执行如下 SQL 语句,进行测试:

-- 测试主键冲突的 SQL 语句
insert into my_class values ('PM3527','B315');
[/code]



如上图所示,当主键已经存在的时候,产生主键冲突。再执行如下 SQL 语言,解决主键冲突的问题:

-- 当主键冲突的时候,进行更新操作
insert into my_class values ('PM3527','B315')
-- 冲突处理
on duplicate key update
-- 更新主键值
room = 'B315';
[/code]



2. 第二种情况:主键冲突,选择替换操作。

基本语法:
replace insert into + 表名 + [(字段列表:包含主键)] + values (值列表);


执行如下 SQL 语句,进行测试:

-- 测试主键冲突的 SQL 语句
insert into my_class values ('PM3528','B215');
[/code]



如上图所示,当主键已经存在的时候,产生主键冲突。再执行如下 SQL 语言,解决主键冲突的问题:

-- 当主键冲突的时候,进行替换操作
replace into my_class values ('PM3528','B215');
[/code]



通过以上两种情况的演示,当再发生主键冲突的时候,咱们已经可以从容应对并解决啦!

h2 id=”蠕虫复制”>二、蠕虫复制

蠕虫复制:从已有的数据表中获取数据,然后将数据进行新增操作,数据成倍(以指数形式)的增加。

根据已有表创建新表,即复制表结构,其基本语法为:

create table + 表名 + like + [数据库名.]表名;


执行如下 SQL 语句,进行测试:

-- 根据已有表,创建新表,当两张表位于同一数据库时,可以省略数据库名称
create table my_copy like my_gbk;
[/code]



如上图所示,表
my_copy
和表
my_gbk
的表结构完成相同。

蠕虫复制的步骤为:先查出数据,然后将查出的数据新增一遍。

基本语法
insert into + 表名 + [()] + select + 字段列表/* + from + 表名;


执行如上 SQL 语句,进行测试:

-- 蠕虫复制
insert into my_copy select * from my_collate_bin;
[/code]



如上图所示,咱们已经成功将表
my_collate_bin
中的数据复制到表
my_copy
中啦!接下来,咱们再执行如下 SQL 语句,测试蠕虫复制的效果:

-- 蠕虫复制
insert into my_copy select * from my_copy;
[/code]



如上图所示,通过观察每次执行 SQL 语句后影响的列数,分别为
4
8
16
等,咱们会发现蠕虫复制的效果呈(指数)爆炸性增长。

蠕虫复制的意义

从已有的数据表中拷贝数据到新的数据表;

可以迅速的让表中的数据膨胀到一定的数量级,多用于测试表的压力及效率。

三、更新数据

基本语法
update + 表名 + set + 字段 = 值 + [where 条件];


高级语法
update + 表名 + set + 字段 = 值 + [where 条件] + [limit 更新数量];


执行如下 SQL 语句,进行测试:

-- 将表 my_copy 中的部分 a 更新为 c
update my_copy set name = 'c' where name = 'a' limit 3;
[/code]

执行上述 SQL 语句前:



执行上述 SQL 语句后:



四、删除数据

与更新类似,可以通过
limit
来限制删除的数量。

基本语法
delete + from + 表名 + [where 条件];


高级语法
delete + from + 表名 + [where 条件] + [limit 删除数量];


执行如下 SQL 语句,进行测试:

-- 将表 my_copy 中的部分 b 删除
delete from my_copy where name = 'b' limit 10;
[/code]



此外,在删除记录的过程中,如果表中存在自增长的主键,那么删除之后,自增长不会还原。执行如下 SQL 语句,进行测试:

-- 删除表 student 中的记录,查看自增长属性
delete from student;
show create table student;
[/code]



如上图所示,显然在咱们删除表
student
中的全部数据之后,
id
的自增长属性值
3
并没有发生改变,这是因为数据的删除是不会改变表结构的。如果想要还原自增长属性,思路是:先删除表,然后重新建表

基本语法
truncate + 表名;


执行如下 SQL 语句,进行测试:

-- 先清空 student 表,再重新创建 student 表
truncate student;
[/code]



如上图所示,显然咱们已经测试成功啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: