Mysql - 增删改
因为项目原因, mysql用了两年了, 但是一直都未曾去总结过. 最近也是领导让总结项目, 才想起把mysql的使用小结一下.
一、 Create
1. 单条插入, sql格式: insert into (列名) values(列值);
INSERT INTO test.tch_teacher ( Sex, BId, NO, NAME, IsDoublePosition, CreateDate )
VALUES ( 1, '', '', 'Insert', 0, NOW() );
对于自增的 Id, 是不需要写的, 数据库会自动生成, 但是如果一不小心写上去了, 只要你的Id值, 在数据库中不存在, 是可以插入进去的.
在mysql中, 就算你插入的 id 为负数, 也是可以插入成功的. 如果数据库中已存在你想插入的 id 值, 则会直接报错.

2. 多条插入, sql格式: insert into (列名) values(列值),(列值),(列值);
INSERT INTO test.tch_teacher ( Sex, BId, NO, NAME, IsDoublePosition, CreateDate )
VALUES
( 2, '', '', 'Insert', 0, NOW() ),
( 3, '', '', 'Insert', 0, NOW() ),
( 4, '', '', 'Insert', 0, NOW() );

新增多条的时候, 也可以循环调用单条插入语句去插入, 不过, 这种方式并不推荐使用, 因为, 这种方式, 消费更多性能和时间.
3. 表插入
可以新建一张临时表: tch_teacher_temp
CREATE TABLE `tch_teacher_temp` (
`Sex` smallint(6) DEFAULT NULL,
`BId` varchar(36) CHARACTER SET utf8 DEFAULT NULL,
`No` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
`Name` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
`IsDoublePosition` bit(1) DEFAULT NULL,
`CreateDate` datetime DEFAULT NULL,
PRIMARY KEY (`Id`)
)
这里有一个取巧的方式, 来获取建表sql
show create table tch_teacher;
然后修改一下表名,删除主键(也可不删)就可以了.
insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate)
select * from tch_teacher_temp;
-- 或者
insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate)
select Sex, BId, NO, NAME, IsDoublePosition, CreateDate from tch_teacher_temp;
4. 性能比较
我粗略测试了一下, 十万级和百万级的数据量, 插入1000条数据. tch_teacher表, 我建了三个索引:Sex, BId, IsDoublePosition
1). 不使用事务, 一条一条插入, 循环以下这条语句, 1000次
for (int i = ; i < ; i++)
{
var param = new { BId = Guid.NewGuid(), Name = names[ran.Next()] + names[ran.Next()] + i, IsDoublePosition = i % , CreateDate = DateTime.Now, Sex = i % , No = ran.Next(, ) };
conn.Execute(insertSql, param);
}
2). 在使用事务的情况下, 还是循环这条语句, 不同的是, 在循环结束处, 加入事务提交(这次的插入是在上次的数据量基础上, 也就是说, 这次插入前, 数据比上次多1000条)
var tran = conn.BeginTransaction();
for (int i = ; i < ; i++)
{
var param = new { BId = Guid.NewGuid(), Name = names[ran.Next()] + names[ran.Next()] + i, IsDoublePosition = i % , CreateDate = DateTime.Now, Sex = i % , No = ran.Next(, ) };
conn.Execute(insertSql, param, tran);
}
tran.Commit();
3). 拼接sql语句的情况下, 由于是"(),(),();"格式的, 所以参数我全做入sql中了, 这里参数化的方式, 不好做. (这次的插入也是在上次的数据量基础上, 也就是说, 这次插入前, 数据比上次多1000条)
StringBuilder sb = new StringBuilder("insert into tch_teacher(BId,Sex,No, Name, IsDoublePosition, CreateDate) values ", );
for (int i = ; i < ; i++)
{
sb.Append(string.Format("('{0}', {1}, '{2}', '{3}', {4}, '{5}'),",
Guid.NewGuid(),
i % ,
ran.Next(, ),
names[ran.Next()] + names[ran.Next()] + i,
i % ,
DateTime.Now.ToString("yyyy-MM-dd")));
}
sb.Remove(sb.Length - , );
conn.Execute(sb.ToString());
这种方式, 有两个不好的地方, 一个是不能参数化, 另一个是如果插入数据较多, 会导致sql语句太长, 所以并不推荐
4). 建临时表的方式, 这里我是事先吧临时表建好的, 在代码里面就没有建了
var insertSql = @"insert into tch_teacher_temp(BId,Sex,No, Name, IsDoublePosition, CreateDate) values(@BId, @Sex, @No, @Name, @IsDoublePosition, @CreateDate);";
var tran = conn.BeginTransaction();
for (int i = ; i < ; i++)
{
var param = new { BId = Guid.NewGuid(), Name = names[ran.Next()] + names[ran.Next()] + i, IsDoublePosition = i % , CreateDate = DateTime.Now, Sex = i % , No = ran.Next(, ) };
conn.Execute(insertSql, param, tran);
}
conn.Execute(@"insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate) select Sex, BId, NO, NAME, IsDoublePosition, CreateDate from tch_teacher_temp;", null, tran1);
tran.Commit();
这种方式, 每次都要新建表, 删除表. 也是挺麻烦的, 这里的测试, 就没有包含新建表和删除表了
结果:
| 十万(ms) | 百万(ms) | |
| sql拼接 | 230 | 359 |
| 事务提交 | 412 | 511 |
| 临时表 | 661 | 1424 |
| 一条一条 | 27606 | 36620 |
除了一条一条提交方式, 其他的在时间上, 还是能接受的, 但是推荐使用第2种, 事务提交方式, 易用, 清晰, 省事.
二、Delete
删除就相对简单多了. 删除sql的格式: delete from 表名 where 条件
删除的时候, 如果不加where条件, 就是删除整张表的数据, 相当于 where 1=1 ;
delete from tch_teacher where id=1;
这是一条最简单的语句了.
删除的时候, 对于主键的自增没有影响. 比如主键为 1,2,3
这时候删除了3, 再插入一条数据, 主键为从4开始.
如果想要让主键又从1开始的话, 需要使用truncate
truncate table tch_teacher ;
这样, 表回归初始状态.
有时候, 通过where查找后, 能得出很多条数据, 但是我只想删除其中的前几条, 那怎么办呢. 有办法
delete from tch_teacher where isDoublePosition=1 order by id limit 6;
这条语句, 就是删除 满足条件的, 前6条数据
三、Update
sql格式: update 表名 set 列=值 where 条件
update的where条件也是可以不加的, 不加的情况下, 修改的就是全部数据.
update tch_teacher set name='黑茶' where id=3;
修改的时候, 也是可以通过连表的方式, 去修改数据的.
update tch_teacher , tch_contact set tch_teacher.`Name`='红茶' where tch_teacher.Id=tch_contact.TId and tch_contact.Id=1003;
Mysql - 增删改的更多相关文章
- MySQL—增删改查,分组,连表,limit,union,alter,排序,去重
MySQL增删改查 在表格的增删改查中,查的内容是最多的,包括group by ,join,limit,union,alter,排序都是服务于查的 #sql语句数据行操作补充 #增加: #insert ...
- PHP MySql增删改查
mysql_connect()连接数据库 mysql_select_db选择数据库 mysql_fetch_assoc()获取结果集 mysql_query()执行sql语句 实例如下: <?p ...
- mysql增删改查练习
Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create dat ...
- Django学习之mysql增删改查
上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...
- mysql增删改查相关操作
mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- MySQL增删改查的常用语句汇总
MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...
- nodejs+express+mysql 增删改查
之前,一直使用的是nodejs+thinkjs来完成自己所需的项目需求,而对于nodejs中另外一中应用框架express却了解的少之又少,这两天就简单的了解了一下如何使用express来做一些数据库 ...
- Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
最近这段时间研究Node感觉不错,自己做了一个增删改查,虽然有些简陋,但是思想是想通的,其实所有项目都是增删改查,有助于初学者快速掌握Node 首先 本实例展示的是基于Node+Express+nod ...
- mysql 增删改查最基本用法小结
目录: 1.新建数据库 2.新建数据表 3.查看表结构 4.增删改查 建立一个数据库students 建立一块数据表class1 内容包括: id 主键 自动编号 无符号位 SMALLINT类型 na ...
随机推荐
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- Centos——安装JDK
写在前面: Just mark! 创建linux虚拟机的时候经常要安装JDK,配置环境变量,却又经常忘记,这里记录一下. 环境:Centos-6.8-x86_64-minimal JDK :jdk-7 ...
- Xshell 连接CentOS服务器解密
平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html Xshell生成密钥key(用于Linux 免密码登录)htt ...
- video.js
1.github地址 2.常用API: class : video-js: video-js应用视频所需的风格.js功能,比如全屏和字幕. vjs-default-skin: vjs-default- ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
- 来吧,HTML5之基础标签(下)
<dialog> 标签 定义对话框或窗口. <dialog> 标签是 HTML 5 的新标签.目前只有 Chrome 和 Safari 6 支持 <dialog> ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- UVa 122 Trees on the level
题目的意思: 输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余. 网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客 说一 ...
- javascript函数
array.sort(function(a, b){ return a -b ; } ) 把数组 array 按照从小到大排序. [11, 22, 586, 10, -58, 86].sort(f ...