MySQL中mysql replaceinto INTO和INSERT INTO的区别分析

当前访客身份:游客 [
:sr.Read(bt[ 0 ] , sr.Size);...
:procedure TFormMain.btn1Click(Sender: TObject...
:其实 Delphi 已经为我们做好了一切,不必再写代码...
:if DM.cdtPackage.Active then begin DM.cdtPack...
:procedure Test(p: PChar); external 'Lib.dll';...
:CREATE PROCEDURE GetUsersDynamic(WhereConditi...
:http://blog.csdn.net/boonya/article/details/3...
:/zoupeiyang/p/4034517.h...
:C# 读取 appconfig文件配置数据库连接的方法 AP...
:string conStr = "Data Source=192.168.6.5;port...
今日访问:42
昨日访问:181
本周访问:223
本月访问:2570
所有访问:42477
MySQL的Replace into 与Insert into ..... on duplicate
发表于1年前( 15:23)&&
阅读(52)&|&评论()
0人收藏此文章,
MySQL的Replace into 与Insert into ..... on duplicate key update ...真正的不同之处
(1),没有key的时候,replace与insert .. on deplicate udpate相同。(2),有key的时候,都保留主键值,并且auto_increment自动+1不同之处:有key的时候,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如例子中c字段的值会被自动填充为默认值。 & & &而insert .. deplicate update则只执行update标记之后的sql,从表象上来看相当于一个简单的update语句。 & & &但是实际上,根据我推测,如果是简单的update语句,auto_increment不会+1,应该也是先delete,再insert的操作,只是在insert的过程中保留除update后面字段以外的所有字段的值。 &
所以两者的区别只有一个,insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。 从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读mysql中text,longtext,mediumtext字段类型的意思,以及区别
中text,longtext,mediumtext字段类型的意思,以及区别&& & MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。&&& & 由MySQL支持的列类型列在下面。下列代码字母用于描述中:&&M 指出最大的显示尺寸。最大的合法的显示尺寸是 255 。&D 适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。&方括号(&[&和&]&)指出可选的类型修饰符的部分。&&注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。&&TINYINT[(M)] [UNSIGNED] [ZEROFILL]&一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。&&SMALLINT[(M)] [UNSIGNED] [ZEROFILL]&一个小整数。有符号的范围是-3,无符号的范围是0到65535。&&MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]&一个中等大小整数。有符号的范围是-88607,无符号的范围是0到。&&INT[(M)] [UNSIGNED] [ZEROFILL]&一个正常大小整数。有符号的范围是-到,无符号的范围是0到。&&INTEGER[(M)] [UNSIGNED] [ZEROFILL]&这是INT的一个同义词。&&BIGINT[(M)] [UNSIGNED] [ZEROFILL]&&一个大整数。有符号的范围是-75807,无符号的范围是0到&&。注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,因此你不应该使用大于位)的有符号大整数,除了位函数!注意,当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数),如果结果大于4775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数,其精度可以是&=24,对一个双精度浮点数,是在25 和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数位数是未定义的。在MySQL3.23中,这是一个真正的浮点值。在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。&&FLOAT[(M,D)] [ZEROFILL]&一个小(单精密)浮点数字。不能无符号。允许的值是-3.E+38到-1.E-38,0 和1.E-38到3.E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有&24 的一个参数表示一个单精密浮点数字。&&DOUBLE[(M,D)] [ZEROFILL]&一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.到-2.、 0和2.到1.。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 & = X & = 53)代表一个双精密浮点数字。&&DOUBLE PRECISION[(M,D)] [ZEROFILL]&&REAL[(M,D)] [ZEROFILL]&这些是DOUBLE同义词。&&DECIMAL[(M[,D])] [ZEROFILL]&一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:&未压缩&意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数点,并且对于负数,&-&符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。注意,在MySQL3.22里,M参数包括符号和小数点。&&NUMERIC(M,D) [ZEROFILL]&这是DECIMAL的一个同义词。&&DATE&一个日期。支持的范围是&#39;&#39;到&#39;&#39;。MySQL以&#39;YYYY-MM-DD&#39;格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。&&DATETIME&一个日期和时间组合。支持的范围是&#39; 00:00:00&#39;到&#39; 23:59:59&#39;。MySQL以&#39;YYYY-MM-DD HH:MM:SS&#39;格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。&&TIMESTAMP[(M)]&一个时间戳记。范围是&#39; 00:00:00&#39;到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。&TIME&一个时间。范围是&#39;-838:59:59&#39;到&#39;838:59:59&#39;。MySQL以&#39;HH:MM:SS&#39;格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。&&YEAR[(2|4)]&一个2或4位数字格式的年(缺省是4位)。允许的值是,和0000(4位年格式),如果你使用2位,( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。)&&CHAR(M) [BINARY]&一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。&&[NATIONAL] VARCHAR(M) [BINARY]&一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。 VARCHAR是CHARACTER VARYING一个缩写。&&TINYBLOB&&TINYTEXT&一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。&BLOB&&TEXT&一个BLOB或TEXT列,最大长度为-1)个字符。&&MEDIUMBLOB&&MEDIUMTEXT&一个BLOB或TEXT列,最大长度为^24-1)个字符。&LONGBLOB&&LONGTEXT&一个BLOB或TEXT列,最大长度为(2^32-1)个字符。&&ENUM(&#39;value1&#39;,&#39;value2&#39;,...)&枚举。一个仅有一个值的字符串对象,这个值式选自与值列表&#39;value1&#39;、&#39;value2&#39;, ...,或NULL。一个ENUM最多能有65535不同的值。&&SET(&#39;value1&#39;,&#39;value2&#39;,...)&一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表&#39;value1&#39;, &#39;value2&#39;, ...选出。一个SET最多能有64个成员。&
顶一下(0) 踩一下(0)
热门标签:MySQL中replace into语句的用法详解
在向表中插入数据的时候,经常遇到这样的情况:
1、首先判断数据是否存在;
2、如果不存在,则插入;
3、如果存在,则更新。
在 SQL Server 中可以这样写:
if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() where id = 1
在 中也可以先select,判断是否存在,存在则 update 否则 insert
但在MySQL 中有更简单的方法,使用 replace into关键字
代码如下:replace into table(id, update_time) values(1, now());
replace into table(id, update_time) select 1, now();
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中。
1、如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
2、 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
MySQL中replace into有三种写法:
1. replace into table(col, ...) values(...)
2. replace into table(col, ...) select ...
3. replace into table set col=value, ...
前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。
另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
可惜的是replace不支持update某些特性,也就不能直接当作update使用:
常见update写法:update table set col=col+1 where id=1;
使用replace into不支持这样的写法:replace into table set col=col+1,id=1;
1、首先判断数据是否存在;(没问题)
2、如果不存在,则插入;(没问题)
3、如果存在,某字段值在原来的基础上加上或减去某个数,如加一操作。(不支持)
顶一下(0) 踩一下(0)
热门标签:}

我要回帖

更多关于 insert replace into 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信