MySQL实战之Insert语句的使用心得_Mysql

来源:脚本之家  责任编辑:小易  

1. 基础的Insert语句示2113例下面的语句向员工表插5261入一条新记录。在这个例子中4102,后的“values”指定要插入到表中的所有1653字段对应的值。INSERT INTO employee VALUES(100,'Thomas','Sales',5000);用SELECT语句来验证数据是否插入成功。SELECT * FROM employee;2. 只针对选定的字段插入值如果你只想向选定的字段插入值,你需要在INSERT语句中明确指定要插入的字段名字。 下面的代码仅插入id和name列的数据INSERT INTO employee(id,name) VALUES(200,'Jason');以上代码中,我们未对dept和salary列指定任何值。所以,以上两个字段的值为NULL,当我们用SELECT语句检索数据时。需要注意的是,NULL不是指"NULL"字符串,SELECT语句使用"NULL"来表示这个字段的值是空的而已。mysql> SELECT * FROM employee;+-----+--------+-------+--------+| id | name | dept | salary |+-----+--------+-------+--------+| 100 | Thomas | Sales | 5000 || 200 | Jason | NULL | NULL |+-----+--------+-------+--------+2 rows in set (0.00 sec)3. INSERT SET示例INSERT语句不仅仅可以使用"VALUE"关键字,也可以使用"SET"关键字。下面的例子与上面的例子结果一样,但是使用的是SET关键字。mysql> INSERT INTO employee SET id=300, name='Mayla';mysql> select * from employee;+-----+--------+-------+--------+| id | name | dept | salary |+-----+--------+-------+--------+| 100 | Thomas | Sales | 5000 || 200 | Jason | NULL | NULL || 300 | Mayla | NULL | NULL |+-----+--------+-------+--------+4.从另一个表中检索数据插入下面的例子中,我们会使用INSERT ... SELECT语句,这个语句可以从其他表中检索数据,并插入到目标表。 下面的代码从Contractor表中检索所有数据并插入到Employee表。INSERT INTO employee SELECT * FROM contractor;SELECT语句中可以根据需要使用WHERE子句,用来检索需要的从Contractor表插入到Employee表的数据。INSERT INTO employee SELECT * FROM contractor WHERE salary >= 7000;注意:如果你使用oracle数据库,你的SQL应该这样写"INSERT INTO employee AS SELECT * FROM contractor"。需要注意在MySQL中不适用AS关键字。5.从其他表中选择部分字段插入当然,你也可以从其他表中选择部分字段的数据插入到你的表中。 下面的例子将从contractor表中选择id,name字段的所有数据插入到employee表。INSERT INTO employee(id,name) SELECT id,name FROM contractor;跟前面的例子一样,可以使用WHERE子句过滤数据。INSERT INTO employee(id,name) SELECT id,name FROM contractor WHERE salary >= 7000;注意:如果employee表中已存在相同主键(这里的主键是id)的记录,你会得到一条错误信息。下面是一个示例错误信息,指出employee表中已经存在id为100的记录。ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'6. 插入数据到指定分区如果创建了分区表(分区类型为range)并希望将输入插入到指定分区,可以参考下面代码。 将数据插入到分区p1中的employee表。INSERT INTO employee PARTITION (p1) VALUES(100,'Thomas','Sales',5000);注意:如果该分区的employee表中已包含相应的数据(这里是id=100的employee数据),你会得到如下错误信息。ERROR 1729 (HY000): Found a row not matching the given partition set注意: 分区仅在MySQL5.6及以上版本可用。7. 插入数据到多个分区可以使用单条SQL语句将数据插入到多个分区。下面的INSERT语句将id为100的记录插入到p1分区,将id为200的记录插入到p2分区。INSERT INTO employee PARTITION (p1, p2) VALUES(100,'Thomas','Sales',5000), (200,'Jason','Technology',5500);注意: 在上例中,如果MySQL往任意分区插入数据失败,那么整个INSERT语句将失败。当然,这同样仅能在MySQL5.6及以上版本使用。8. 在插入过程中忽略错误在一些场景中(比如:批处理),你可能希望忽略插入过程中MySQL产生的错误信息,你可以使用INSERT IGNORE语句。 比如:下面的例子会抛出错误信息,提示数据已经存在。mysql> INSERT INTO employee VALUES(100,'Thomas','Sales',5000);ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'要忽略上面的错误信息,可以使用INSERT IGNORE来替换INSERT语句(执行前请确保这条对应的主键已经存在)。mysql> INSERT IGNORE INTO employee VALUES(100,'Thomas','Sales',5000);Query OK, 0 rows affected (0.00 sec)INSERT IGNORE仅仅只是忽略错误信息,不会进行其他任何处理。9. INSERT语句的默认值如果MySQL运行在strict模式下,并且在我们的INSERT语句中并未指定默认值,那么MySQL将抛出错误信息。 不过,如果MySQL并未启用strict模式(这个是默认启用的)时,同时INSERT语句没有为字段指定值,那么MySQL会为该字段使用字段类型的默认值。 比如,bonus表的所有字段都不允许为空(not null)。mysql> DESC bonus;+--------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+---------+------+-----+---------+-------+| id | int(11) | NO | | NULL | || amount | int(11) | NO | | NULL | |+--------+---------+------+-----+---------+-------+我们先执行以下语句,插入一条数据(id=100)INSERT INTO bonus(id) VALUES(100);查看刚插入的数据,可以看到amount字段被设置为默认值0SELECT * FROM bonus;+-----+--------+| id | amount |+-----+--------+| 100 | 0 |+-----+--------+如果,SQL语句中同时不指定id和amount字段的值,那么他们都会被自动设置为默认值0。参考下面例子。INSERT INTO bonus VALUES();mysql> select *,背景有人问mysqldump出来的insert语句,是2113否可以按每 10 row 一条insert语句的形5261式组织4102。思考1:参数--extended-insert回忆过去所学:我只知道有1653一对参数--extended-insert(默认值)表示使用长 INSERT ,多 row 在合并一起批量 INSERT,提高导入效率--skip-extended-insert一行一个的短INSERT均不满足群友需求,无法控制按每 10 row 一条 insert 语句的形式组织。思考2:“避免大事务”之前一直没有考虑过这个问题。这个问题的提出,相信主要是为了“避免大事务”。所以满足 insert 均为小事务即可。下面,我们来探讨一下以下问题:1. 什么是大事务?2. 那么 mysqldump 出来的 insert 语句可能是大事务吗?什么是大事务?定义:运行时间比较长,操作的数据比较多的事务我们称之为大事务。大事务风险:∘ 锁定太多的数据,造成大量的阻塞和锁超时,回滚所需要的时间比较长。∘ 执行时间长,容易造成主从延迟。∘ undo log膨胀避免大事务:我这里按公司实际场景,规定了,每次操作/获取数据量应该少于5000条,结果集应该小于2Mmysqldump出来的SQL文件有大事务吗?前提,MySQL 默认是自提交的,所以如果没有明确地开启事务,一条 SQL 语句就是一条事务。在 mysqldump 里,就是一条 SQL 语句为一条事务。按照我的“避免大事务”自定义规定,答案是没有的。原来,mysqldump 会按照参数--net-buffer-length,来自动切分 SQL 语句。默认值是 1M。按照我们前面定义的标准,没有达到我们的 2M 的大事务标准。--net-buffer-length 最大可设置为 16777216,人手设置大于这个值,会自动调整为 16777216,即 16M。设置 16M,可以提升导出导入性能。如果为了避免大事务,那就不建议调整这个参数,使用默认值即可。[root@192-168-199-198 ~]# mysqldump --net-buffer-length=104652800 -uroot -proot -P3306 -h192.168.199.198 test t >16M.sqlmysqldump: [Warning] option 'net_buffer_length': unsigned value 104652800 adjusted to 16777216#设置大于16M,参数被自动调整为16M注意,指的是 mysqldump 的参数,而不是 mysqld 的参数。官方文档提到: If you increase this variable, ensure that the MySQL server net_buffer_length system variable has a value at least this large.意思是 mysqldump 增大这个值,mysqld 也得增大这个值,测试结论是不需要的。怀疑官方文档有误。不过,在导入的时候,受到服务器参数 max_allowed_packet 影响,它控制了服务器能接受的数据包的最大大小,默认值是 4194304,即 4M。所以导入数据库时需要调整参数 max_allowed_packet 的值。set global max_allowed_packet=16*1024*1024*1024;不调整的话,会出现以下报错:[root@192-168-199-198 ~]# mysql -uroot -proot -P3306 -h192.168.199.198 test <16M.sqlmysql: [Warning] Using a password on the command line interface can be insecure.ERROR 2006 (HY000) at line 46: MySQL server has gone away相关测试最后,我放出我的相关测试步骤mysql> select version();+------------+| version()  |+------------+| 5.7.26-log |+------------+1 row in set (0.00 sec)造100万行数据create database test;use test;CREATE TABLE `t` (`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,`c` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into t values (1,1,'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyztuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz');insert into t select * from t; #重复执行20次# 直到出现Records: 524288  Duplicates: 0  Warnings: 0# 说明数据量达到100多万条了。mysql> select count(*) from t;+----------+| count(*) |+----------+|  1048576 |+----------+1 row in set (1.04 sec)数据大小如下,有 284MB[root@192-168-199-198 test]# pwd/data/mysql/mysql3306/data/test[root@192-168-199-198 test]# du -sh t.ibd284M    t.ibd--net-buffer-length=1M[root@192-168-199-198 ~]# mysqldump -uroot -proot -S /tmp/mysql3306.sock test t >1M.sql[root@192-168-199-198 ~]# du -sh 1M.sql225M    1M.sql[root@192-168-199-198 ~]# cat 1M.sql |grep -i insert |wc -l226默认 --net-buffer-length=1M 的情况下,225M 的SQL文件里有 226 条 insert ,平均下来确实就是每条 insert 的 SQL 大小为 1M。--net-buffer-length=16M[root@192-168-199-198 ~]# mysqldump --net-buffer-length=16M -uroot -proot -S /tmp/mysql3306.sock test t >16M.sql[root@192-168-199-198 ~]# du -sh 16M.sql225M    16M.sql[root@192-168-199-198 ~]# cat 16M.sql |grep -i insert |wc -l15默认--net-buffer-length=16M 的情况下,225M 的 SQL 文件里有 15 条 insert,平均下来确实就是每条 insert 的 SQL 大小为 16M。所以,这里证明了 --net-buffer-length 确实可用于拆分 mysqldump 备份文件的SQL大小的。性能测试insert 次数越多,交互次数就越多,性能越低。 但鉴于上面例子的 insert 数量差距不大,只有 16 倍,性能差距不会很大(实际测试也是如此)。我们直接对比 --net-buffer-length=16K 和 --net-buffer-length=16M 的情况,他们insert次数相差了 1024 倍。[root@192-168-199-198 ~]# time mysql -uroot -proot -S /tmp/mysql3306.sock test <16K.sqlmysql: [Warning] Using a password on the command line interface can be insecure.real    0m10.911s  #11秒user    0m1.273ssys    0m0.677s[root@192-168-199-198 ~]# mysql -uroot -proot -S /tmp/mysql3306.sock -e "reset master";mysql: [Warning] Using a password on the command line interface can be insecure.[root@192-168-199-198 ~]# time mysql -uroot -proot -S /tmp/mysql3306.sock test <16M.sqlmysql: [Warning] Using a password on the command line interface can be insecure.real    0m8.083s  #8秒user    0m1.669ssys    0m0.066s结果明显。--net-buffer-length 设置越大,客户端与数据库交互次数越少,导入越快。结论mysqldump 默认设置下导出的备份文件,符合导入需求,不会造成大事务。性能方面也符合要求,不需要调整参数。请点击输入图片描述请点击输入图片描述www.zgxue.com防采集请勿采集本网。

一、Insert的几种语法

1-1.普通插入语句

BD_MATERIAL (bm全去掉) psi) un) t1 试试

char sql[] = "insert into phone(phone,code,time)values(%d,%d,%d)" char sqlBuf[1024]; sprintf(sqlBuf, sql, x, y, z); if(mysql_real_query(sock,sqlBuf)) .

INSERT INTO table (`a`, `b`, `c`, ……) VALUES ('a', 'b', 'c', ……);

对应填上!

这里不再赘述,注意顺序即可,不建议小伙伴们去掉前面括号的内容,别问为什么,容易被同事骂。

1-2.插入或更新

我用的是textbox1.text应该也算是变量..你那种我没有试过 你把&改成+试一下 我不知道行不行 String sql="insert into loginuser values('"+name+"','"+psw1+"')";

如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO … ON DUPLICATE KEY UPDATE …"语句:

根据上下文,应该是双引号:+email1+"@"+email2+

情景示例:这张表存了用户历史充值金额,如果第一次充值就新增一条数据,如果该用户充值过就累加历史充值金额,需要保证单个用户数据不重复录入。

这时可以使用"INSERT INTO … ON DUPLICATE KEY UPDATE …"语句。

注意事项:"INSERT INTO … ON DUPLICATE KEY UPDATE …"语句是基于唯一索引或主键来判断唯一(是否存在)的。如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

-- 用户陈哈哈充值了30元买会员INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '充会员') ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='充会员'; -- 用户陈哈哈充值了100元买瞎子至高之拳皮肤INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 100, '2020-06-11 20:00:20', '购买盲僧至高之拳皮肤') ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';

若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,当前username='chenhaha'的记录将被更新,更新的字段由UPDATE指定。

对了,ON DUPLICATE KEY UPDATE为MySQL特有语法,比如在MySQL迁移Oracle或其他DB时,类似的语句要改为MERGE INTO语法,兼容性让人想骂街。但没办法,就像用WPS写的xlsx用Office无法打开一样。

1-3.插入或替换

如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。

情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效率最高,与数据库交互最少,支撑数据库的高可用。

此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。

"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。

"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。

"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。

注意事项:如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

-- 20点充值REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '会员充值'); -- 21点买皮肤REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 100, '2020-06-11 21:00:00', '购买盲僧至高之拳皮肤');

若username='chenhaha'的记录不存在,REPLACE语句将插入新记录(首次充值),否则,当前username='chenhaha'的记录将被删除,然后再插入新记录。

id不要给具体值,不然会影响SQL执行,业务有特殊需求除外。

小tips:

ON DUPLICATE KEY UPDATE:如果插入行出现唯一索引或者主键重复时,则执行旧的update;如果不会导致唯一索引或者主键重复时,就直接添加新行。

REPLACE INTO:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。

replace into 与 insert on deplicate udpate 比较:

1、在没有主键或者唯一索引重复时,replace into 与 insert on deplicate udpate 相同。

2、在主键或者唯一索引重复时,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如c字段的值会被自动填充为默认值(如Null)。

3、细心地朋友们会发现,insert on deplicate udpate只是影响一行,而REPLACE INTO可能影响多行,为什么呢?写在文章最后一节咯~

1-4.插入或忽略

如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略,此时,可以使用INSERT IGNORE INTO …语句:情景很多,不再举例赘述。

注意事项:同上,"INSERT IGNORE INTO …"语句是基于唯一索引或主键来判断唯一(是否存在)的,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

-- 用户首次添加INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 26, 0, '2020-06-11 20:00:20'); -- 二次添加,直接忽略INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 26, 0, '2020-06-11 21:00:20');

二、大量数据插入

2-1、三种处理方式

2-1-1、单条循环插入

我们取10w条数据进行了一些测试,如果插入方式为程序遍历循环逐条插入。在mysql上检测插入一条的速度在0.01s到0.03s之间。

逐条插入的平均速度是0.02*100000,也就是33分钟左右。

下面代码是测试例子:

1普通循环插入100000条数据的时间测试

@Test public void insertUsers1() { User user = new User(); user.setUserName("提莫队长"); user.setPassword("正在送命"); user.setPrice(3150); user.setHobby("种蘑菇"); for (int i = 0; i < 100000; i++) { user.setUserName("提莫队长" + i); // 调用插入方法 userMapper.insertUser(user); } }

执行速度是30分钟也就是0.018*100000的速度。可以说是很慢了

发现逐条插入优化成本太高。然后去查询优化方式。发现用批量插入的方法可以显著提高速度。

将100000条数据的插入速度提升到1-2分钟左右↓

2-1-2、修改SQL语句批量插入

insert into user_info (user_id,username,password,price,hobby) values (null,'提莫队长1','123456',3150,'种蘑菇'),(null,'盖伦','123456',450,'踩蘑菇');

用批量插入插入100000条数据,测试代码如下:

@Test public void insertUsers2() { List<User> list= new ArrayList<User>(); User user = new User(); user.setPassword("正在送命"); user.setPrice(3150); user.setHobby("种蘑菇"); for (int i = 0; i < 100000; i++) { user.setUserName("提莫队长" + i); // 将单个对象放入参数list中 list.add(user); } userMapper.insertListUser(list); }

批量插入使用了0.046s 这相当于插入一两条数据的速度,所以用批量插入会大大提升数据插入速度,当有较大数据插入操作是用批量插入优化

批量插入的写法:

dao定义层方法:

Integer insertListUser(List<User> user);

mybatis Mapper中的sql写法:

<insert id="insertListUser" parameterType="java.util.List"> INSERT INTO `db`.`user_info` ( `id`, `username`, `password`, `price`, `hobby`) values <foreach collection="list" item="item" separator="," index="index"> (null, #{item.userName}, #{item.password}, #{item.price}, #{item.hobby}) </foreach> </insert>

这样就能进行批量插入操作:

注:但是当批量操作数据量很大的时候。例如我插入10w条数据的SQL语句要操作的数据包超过了1M,MySQL会报如下错:

报错信息:

Mysql You can change this value on the server by setting the max_allowed_packet' variable. Packet for query is too large (6832997 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

解释:

用于查询的数据包太大(6832997> 1048576)。 您可以通过设置max_allowed_packet的变量来更改服务器上的这个值。

通过解释可以看到用于操作的包太大。这里要插入的SQL内容数据大小为6M 所以报错。

解决方法:

数据库是MySQL57,查了一下资料是MySQL的一个系统参数问题:

max_allowed_packet,其默认值为1048576(1M),

查询:

show VARIABLES like '%max_allowed_packet%';

修改此变量的值:MySQL安装目录下的my.ini(windows)或/etc/mysql.cnf(linux) 文件中的[mysqld]段中的

max_allowed_packet = 1M,如更改为20M(或更大,如果没有这行内容,增加这一行),如下图

保存,重启MySQL服务。现在可以执行size大于1M小于20M的SQL语句了。

但是如果20M也不够呢?

2-1-3、分批量多次循环插入

如果不方便修改数据库配置或需要插入的内容太多时,也可以通过后端代码控制,比如插入10w条数据,分100批次每次插入1000条即可,也就是几秒钟而已;当然,如果每条的内容很多的话,另说。。

2-2、插入速度慢的其他几种优化途径

A、通过show processlist;命令,查询是否有其他长进程或大量短进程抢占线程池资源 ?看能否通过把部分进程分配到备库从而减轻主库压力;或者,先把没用的进程kill掉一些?(手动挠头o_O)

B、大批量导数据,也可以先关闭索引,数据导入完后再打开索引

关闭:ALTER TABLE user_info DISABLE KEYS;

开启:ALTER TABLE user_info ENABLE KEYS;

三、REPLACE INTO语法的“坑”

上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引,会怎么样呢?我们早一些数据测试一下。

-- 测试表创建,a,b,c三个字段均有唯一索引CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);-- 插入三条测试数据INSERT into table1 VALUES(1,1,1);INSERT into table1 VALUES(2,2,2);INSERT into table1 VALUES(3,3,3);

此时table1中已经有了3条记录,a,b,c三个字段都是唯一(UNIQUE)索引

mysql> select * from table1;+---+---+---+| a | b | c |+---+---+---+| 1 | 1 | 1 || 2 | 2 | 2 || 3 | 3 | 3 |+---+---+---+3 rows in set (0.00 sec)

下面我们使用REPLACE语句向table1中插入一条记录。

REPLACE INTO table1(a, b, c) VALUES(1,2,3);

mysql> REPLACE INTO table1(a, b, c) VALUES(1,2,3);Query OK, 4 rows affected (0.04 sec)

此时查询table1中的记录如下,只剩一条数据了~

mysql> select * from table1;+---+---+---+| a | b | c |+---+---+---+| 1 | 2 | 3 |+---+---+---+1 row in set (0.00 sec)

(老板:插入前10w数据,插入5w数据后还剩8w数据??,咱们家数据让你喂狗了吗!!)

REPLACE INTO语法回顾:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。

我们可以看到,在用REPLACE INTO时每个唯一索引都会有影响的,可能会造成误删数据的情况,因此建议不要在多唯一索引的表中使用REPLACE INTO;

总结

到此这篇关于MySQL实战之Insert语句的使用心得的文章就介绍到这了,更多相关MySQL Insert语句使用心得内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:mysql insert语句操作实例讲解PHP+MySQL之Insert Into数据插入用法分析MySql中使用INSERT INTO语句更新多条数据的例子mysql insert if not exists防止插入重复记录的方法mysql中insert与select的嵌套使用方法正确使用MySQL INSERT INTO语句解析MySQL中INSERT INTO SELECT的使用详解MySQL数据库insert和update语句Mysql使用insert插入多条记录 批量新增数据

在mysql中要向数据库中保2113存数据我们最常用5261的一种方法就是直接4102使用Insert into语句1653来实现了,下面我来给大家详细介绍Insert into语句用法INSERT用于向一个已有的表中插入新行。INSERT…VALUES语句根据明确指定的值插入行。让我们先来看一下insert语句标准的定义,放在[]内的都是可以省略的:语法INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]实例create table links (name varchar(255) not null default '', address varchar(255) not null default '');最简单的插入方法代码如下 复制代码 Mysql>insert into worker values(‘tom’,’tom@yahoo.com’),(‘paul’,’paul@yahoo.com’);或insert into links values('jerichen','gdsz');批量保存数据假如我们想一次性的往数据库里插入多条数据咋办?一定要写多条语句吗?肯定是不会的,因为MySQL设计的还是很人性的。其提供insert语句的一种非标准格式,即,values(字段值1,字段值2,字段值3),(另一个字段1的值,另一个字段2的值,另一个字段3的值);# 同时插入两条数据,看语法说明,那个into被我省略了代码如下 复制代码 insert links (name,url) values('jerichen','gdsz'),('alone','gdgz'); 使用INSERT…SELECT语句插入从其他表选择的行当我们在上一节学习创建表时,知道可以使用select从其它表来直接创建表,甚至可以同时复制数据记录。如果你已经拥有了一个表,你同样可以从select语句的配合中获益。从其它表中录入数据,例如:代码如下 复制代码 mysql>insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;你也可以略去目的表的列列表,如果你每一列都有数据录入。代码如下 复制代码 mysql>insert into tbl_name1 select col3,col4 from tbl_name2;INSERT INTO ... SELECT语句满足下列条件:查询不能包含一个ORDER BY子句,用shell脚本通过2113while循环批量生成mysql测试数据5261的方法。41021、很多时候需要在mysql表中插入大1653量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可。复制代码代码如下:#!/bin/bashi=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]domysql -uroot -proot afs -e "insert into afs_test (name,age,createTime) values ('HELLO$i',$i % 99,NOW());"d=$(date +%M-%d\ %H\:%m\:%S)echo "INSERT HELLO $i @@ $d"i=$(($i+1))sleep 0.05doneexit 02、假定上面的shell脚本保存为create-data.sh,可以通过下面的命令来生成数据:复制代码代码如下:sh create-data.sh 10000。(参数10000是要生成的数据条数。)本回答被网友采纳内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql跨库事务xa操作示例
  • mysql性能全面优化方法参考,从cpu,文件系统选择到mysql.cnf参数优
  • mysql事项,视图,函数,触发器命令(详解)
  • mysql数据库设置utf-8编码的方法步骤
  • mysql实现两张表数据的同步
  • mysql存储过程之错误处理实例详解
  • 如何用命令行进入mysql具体操作步骤
  • 史上最全的mysql备份方法
  • mysql中replace into语句的用法详解
  • mysql聚簇索引的页分裂原理实例分析
  • 如何使用mysql语句向表中插入数据
  • mysql insert语句注意什么
  • 一句简单的MySql插入语句怎么写
  • MySQL用insert语句时如何实现默认值效果
  • mysql的insert语句插入从别的表查询出来的数据
  • mysql insert语句怎么插入变量
  • 请问高手,在MYSQL中,运行INSERT INTO 插入语句中...
  • mysql插入语句中使用变量
  • Eclipse中使用mysql的insert语句
  • 关于mysql的insert into与主键的问题,我的主要疑...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysql insert语句操作实例讲解php+mysql之insert into数据插入用法分析mysql中使用insert into语句更新多条数据的例子mysql insert if not exists防止插入重复记录的方法mysql中insert与select的嵌套使用方法正确使用mysql insert into语句解析mysql中insert into select的使用详解mysql数据库insert和update语句mysql使用insert插入多条记录 批量新增数据mysql跨库事务xa操作示例mysql性能全面优化方法参考,从cpu,文件系统选择到mysql.cnf参数优mysql事项,视图,函数,触发器命令(详解)mysql数据库设置utf-8编码的方法步骤mysql实现两张表数据的同步mysql存储过程之错误处理实例详解如何用命令行进入mysql具体操作步骤史上最全的mysql备份方法mysql中replace into语句的用法详解mysql聚簇索引的页分裂原理实例分析mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql日期数据类型、时间类型使用mysql——修改root密码的4种方法mysql之timestamp(时间戳)用法mysql update语句的用法详解mysql join联表及id自增实例解析完全卸载mysql(停止服务、卸载相关程序、mysql从myisam转换成innodb错误与常用解决mysql临时表用法分析【查询结果可存在临时浅析mysql 定时备份任务mysql 5.7.30安装配置方法图文教程mysql数据库安全配置介绍mysql存储过程学习笔记--建立简单的存储过ubuntu上安装mysql+问题处理+安全优化mysql中engine=innodb和engine=myisam的区
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved