MySQL的Replace into 与Insert into on duplicate key update真
看下面的例子吧: 1 Replace into ... 1.1 录入原始数据 mysql> use test; Database changed mysql>
ALTER TABLE t1 CHANGE a a INT PRIMARY KEY AUTO_INCREMENT ; Query OK,1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO t1 SELECT 2,'2','3';
1.2 开始replace操作 【】看到这里,replace,看到这里,a=2的记录中c字段是空串了, 1.3 但是不知道对主键的auto_increment有无影响,接下来测试一下: mysql> insert into t1(b,c) select 'r4','r5'; Query OK,1 row affected (0.05 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t1; +---+----+----+ | a | b | c | +---+----+----+ | 1 | c3 | c2 | | 2 | a | | | 3 | r2 | r3 | | 5 | r4 | r5 | +---+----+----+ 4 rows in set (0.00 sec)
【】从这里可以看出,新的自增不是从4开始,而是从5开始,就表示一个repalce操作,主键中的auto_increment会累加1. 当没有key时,replace相当于普通的insert. 2.1 ok,再来看Insert into ..... on duplicate key update, mysql> insert into t1(a,b) select '3','r5' on duplicate key update b='r5'; Query OK,2 rows affected,1 warning (0.19 sec) Records: 1 Duplicates: 1 Warnings: 1 mysql> select * from t1; +---+----+----+ | a | b | c | +---+----+----+ | 1 | c3 | c2 | | 2 | a | | | 3 | r5 | r3 | | 5 | r4 | r5 | +---+----+----+ 4 rows in set (0.00 sec) 【】a=5时候,原来的c值还在,这表示当key有时,只执行后面的udate操作语句. 2.2 再检查auto_increment情况。 mysql> insert into t1(a,1 warning (0.19 sec) Records: 1 Duplicates: 1 Warnings: 1 mysql> select * from t1; +---+----+----+ | a | b | c | +---+----+----+ | 1 | c3 | c2 | | 2 | a | | | 3 | r5 | r3 | | 5 | r4 | r5 | +---+----+----+ 4 rows in set (0.00 sec) mysql> insert into t1(b,c) select 'r6','r7'; Query OK,1 row affected (0.19 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t1; +---+----+----+ | a | b | c | +---+----+----+ | 1 | c3 | c2 | | 2 | a | | | 3 | r5 | r3 | | 5 | r4 | r5 | | 7 | r6 | r7 | +---+----+----+ 5 rows in set (0.00 sec) 【】从这里可以看出,新的自增不是从6开始,而是从7开始,就表示一个Insert .. on deplicate udate操作,主键中的auto_increment也跟replace一样累加1. 2.3 再看下当没有key的时候,insert .. on deplicate update的情况 mysql> insert into t1(a,b,c) select '33','r5','c3' on duplicate key update b='r5'; Query OK,1 row affected,1 warning (0.23 sec) Records: 1 Duplicates: 0 Warnings: 1 mysql> select * from t1; +----+----+----+ | a | b | c | +----+----+----+ | 1 | c3 | c2 | | 2 | a | | | 3 | b5 | r3 | | 5 | r4 | r5 | | 7 | r6 | r7 | | 9 | s6 | s7 | | 33 | r5 | c3 | +----+----+----+ 7 rows in set (0.00 sec) 看a=33的记录,ok,全部录入了。 3 总结从上面的测试结果看出,相同之处: 个人倾向与用Replace。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 选择可以区分Sql Server中nvarchar列的’ss’
- sql – ScalaQuery多个主键和外键
- 用于删除Sybase SQL Anywhere 9中所有连接/锁的脚本/命令?
- sql-server – 将SP返回值设置为SQL Server中的变量
- mssqlserver - 查询执行的错误信息以及事务回滚
- entity-framework – SQL FileStream Entity Framework存储
- sql – 更新多行时转换NULL类型
- MySql插入数据成功但是报[Err] 1055错误的解决方案
- 如何恢复SQL Server 2000损坏的数据库文件
- SQL中一些不是很常用的SQL语句