mysql 插入/更新数据

INSERT 语句

1、一次性列出全部字段的值,例如:

INSERT INTO student VALUES('Chenqi','M', 29);
INSERT INTO student VALUES('Bush','M', 60),('Obama', 'M', 45);

允许同时插入多个数据行;

2、只对部分字段赋值

INSERT INTO student(name, sex) VALUES ('Abby', 'F'),('Joseph', 'M');

没有在INSERT语句中出现的字段将被赋予默认值。允许同时插入多个数据行;

3、使用SET子句

INSERT INTO student SET name='Stein', sex='M';

没有在SET子句里出现的字段被赋予默认值。这种形式的ISNERT语句不允许一次插入多个数据行。

REPLACE 语句

REPLACE语句和INSERT语句用法非常相似,唯一的区别就是,在一个UNIQUE索引或PRIMARY KEY中出现重复值的时候,REPLACE会先删除旧行后再插入新行,INSERT语句则报错。
如果数据表没有使用PRIMARY KEY或UNIQUE索引,则REPLACE与INSERT语句完全一样。

INSERT ... ON DUPLICATE KEY UPDATE Syntax

如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。

例如,如果列 a 为拥有UNIQUE索引,并且包含值1,

CREATE TABLE t (id INT AUTO_INCREMENT,a INT, b INT, c INT, PRIMARY KEY(id), UNIQUE KEY(a));

INSERT INTO t (a,b,c) VALUES (,,);

则以下两个语句具有相同的效果:

INSERT INTO t (a, c) VALUES (, ) ON DUPLICATE KEY UPDATE c=c+;
UPDATE table SET c=c+ WHERE a=;

如果行作为新记录被插入,则受影响行(affected-rows)的值显示1;如果原有的记录被更新,则受影响行的值显示2。

也可以INSERT多行记录:

INSERT INTO TABLE (a,c) VALUES (,),(,) ON DUPLICATE KEY UPDATE c=c+;

执行后,c 的值会变为 13 (c 在原值上+1).

使用VALUES函数

INSERT INTO  t(a,c) VALUES (,),(,) ON DUPLICATE KEY UPDATE c=VALUES(c)+;

执行后,c 的值会变为 8 (c 在插入值上+1).


LOAD DATA LOCAL INFILE file_name INTO TABLE table_name

默认情况下,LOAD DATA语句假设各字段的值以'\t'分隔,数据行以'\n'分隔,数据值的排列顺序与字段在数据表里的先后顺序一致。

LOCAL关键字可以使客户程序读取数据文件并发送到服务器以加载,如果省略LOCAL关键字,就表示数据文件是保存在服务器主机上的,而你必须拥有相应的FILE服务器访问权限才能把文件里的数据加载到数据表里去。

加载数据文件的另一种方法是使用mysqlimport工具,例如:

mysqlimport -r -L -u username -p passwd -h hostname -P port db_name file_name

该命令将生成一条把file_name文件里的数据值加载到db_name的指定数据表里去的LOAD DATA语句。

注意:mysqlimport 程序是根据数据文件的名字来确定与之对应的数据表的,例如:

mysqlimport -L sampdb member.txt

就是将member.txt数据文件加载到sampdb.member数据表的。

mysqlimport 的选项:

-r:--replace,对于unique key上的重复记录,使用新行取代旧记录;

-i:--ignore,对于unique key上的重复记录,忽略不处理;

-L:--local,从客户端本地主句读取输入文件;

-c,--columns,指定输入数据文件中的字段列表(有序);
-D,--delete,在导入新数据文件之前,清空数据表;


有效加载数据

MySQL对于大规模数据加载(mass insertion)的场景,通常考虑以下几个方面:

1、批量加载的效率比逐行加载的效率高,因此要尽量使用INSERT INTO语句一次插入多个数据行的功能;

2、使用LOAD DATA语句要比使用INSERT语句效率高,服务器只需要对一个语句进行语法分析和解释,并且索引只在所有数据行都处理完成后才需要刷新;

3、使用LOAD DATA语句要比使用LOAD DATA LOCAL语句效率高,因为前者服务器可以直接从磁盘上读取文件,后者则需要通过网络将数据文件送到服务器上。

如果只能使用多个INSERT语句,要尽可能地对它们分组以减少索引的刷新次数,可以通过事务而不用自动提交的方式来实现这一点:

START TRANSACTION
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
COMMIT;

对于非事务性的存储引擎,可以通过对数据表加写锁定的方式来实现:

LOCK TABLES tbl_name WRITE;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
UNLOCK TABLES;

对于MyISAM数据表,减少索引刷新次数的另一个策略是使用DELAY_KEY_WRITE数据表选项。

参考文档:

http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

mysql 插入/更新数据的更多相关文章

  1. 如何实现MySQL随机查询数据与MySQL随机更新数据?

    以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL ...

  2. 【SQL模板】三.插入/更新 数据模板TSQL

    ---Name: 插入/更新 数据模板.sql ---Purpose: 用于更新 数据库中 历史数据 或 插入 新数据 的脚本模板 ---Author: xx ---Time: 2015-12-18 ...

  3. SQL Server ->> DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异

    之前对于“DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异”这两种方法一直认为其实应该差不多,因为无论如何索引最后都需要被维护,只不过是个时间顺序先后的问题 ...

  4. mySQL 插入,更新和删除数据

    插入数据: 语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如 ...

  5. [转载]mysql插入大量数据

    mysql的批量数据格式, 比如 INSERT INTO TABLES (LABLE1,LABLE2,LABLE3,...)  VALUES(NUM11,NUM12,NUM13,...),  (NUM ...

  6. C API向MySQL插入批量数据的快速方法——关于mysql_autocommit

    MySQL默认的数据提交操作模式是自动提交模式(autocommit).这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置autocommit的值改变是否是自 ...

  7. MySQL插入中文数据出现?号

    原文转载自:https://blog.csdn.net/LynneZoe/article/details/79174119 运行环境:win10 mysql版本:Mysql5.6 做一个项目的时候,向 ...

  8. mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE

    有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, ...

  9. 【MySQL插入更新重复值】ON DUPLICATE KEY UPDATE用法

    要插入的数据  与表中记录数据的 惟一索引或主键中产生重复值,那么就会发生旧行的更新 弊端:造成主键自增不连续.适合数据量不大的表. ON DUPLICATE KEY UPDATE后面的条件 eg有如 ...

随机推荐

  1. 02python算法-二分法简介

    老规矩: 什么是二分法: 其实是一个数学领域的词,但是在计算机领域也有广泛的使用. 为什么需要二分法? 当穷举算法性能让你崩溃时. 二分法怎么用呢? 让我们先玩一个游戏先,我心里想一个100以内的整数 ...

  2. mysql查看数据库

    进入MySQL Command line client下查看当前使用的数据库: mysql>select database(); mysql>status; mysql>show t ...

  3. nutch-介绍

    本文主要源于http://www.ibm.com/developerworks/cn/opensource/os-cn-nutchintro/ 基本信息 Nutch是一个开放源代码(open-sour ...

  4. 简进祥==iOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  5. Hadoop版本变迁

    内容来自<Hadoop技术内幕:深入解析YARN架构设计与实现原理>第2章:http://book.51cto.com/art/201312/422022.htm Hadoop版本变迁 当 ...

  6. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  7. SqlServerException:拒绝对表对象的select,insert权限解决(新建账号导致的问题)

    继上一篇文章所述的问题,这次又出现了不能插入的问题.经过定位,也是由于我多选择了一个数据库用户角色的权限导致的,下面是详细的操作步骤 SqlServerException:拒绝了对对象 '...'(数 ...

  8. SQL查询——SQL LEFT JOIN/SQL RIGHT JOIN

    简介 在实际情况下,比如在一个大学里,有很多老师,老师都有自己的研究方向和职称.并且,可能并不是每个老师都带有研究生,如果一个新来的老师,可能还没有带研究生.所以,如果领导要求查出所有老师带研究生的数 ...

  9. matlab从txt文本导入数据作图

    Matlab上 fr = fopen('d:\Matlab\长期纪录2014-3-11.txt', 'r');data=fscanf(fr,'%f',[1,inf]);axis([0 90000 -8 ...

  10. iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶

    Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...