<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[MySQL：讨人喜欢的 MySQL replace into 用法（insert into 的增强版）]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 25 Dec 2009 07:09:38 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	缘起：<br/>REPLACE的运行与INSERT很相似。只有一点例外，假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值，则在新记录被插入之前，旧记录被删除。<br/>依赖主键或索引Mysql能够实现快速的判断，使用REPLACE，需要同时拥有表的INSERT和DELETE权限。<br/><br/>注意，除非表有一个PRIMARY KEY或UNIQUE索引，否则，使用一个REPLACE语句没有意义。该语句会与INSERT相同，因为没有索引被用于确定是否新行复制了其它的行。 <br/>添加唯一索引如下，实践成功：<br/><textarea name="code" class="C" rows="15" cols="100">
ALTER TABLE `tempsetting` ADD UNIQUE INDEX `settingName`(`settingName`); 
CREATE UNIQUE INDEX settingName ON tempsetting(settingName(100))
</textarea><br/><br/>多次replace插入实现修改唯一settingName所对应的值：<br/><textarea name="code" class="php" rows="15" cols="100">
replace into&nbsp;&nbsp; tempsetting (settingName,settingValue,updatedTimes) values (&quot;settingTempValue&quot;,&quot;38.9&quot;,&quot;1431587093&quot;);
</textarea><br/>多次插入不同的温度值，的确是Ok的：<br/>id 自增编号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settingName 变量名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settingValue 变量数值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updatedTimes 修改次数<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;settingTempValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8388607<br/><br/>正文：<br/>讨人喜欢的 MySQL replace into 用法（insert into 的增强版）<br/><br/>在向表中插入数据的时候，经常遇到这样的情况：1. 首先判断数据是否存在； 2. 如果不存在，则插入；3.如果存在，则更新。<br/><br/>在 SQL Server 中可以这样处理：<br/><div class="code"><br/>&nbsp;&nbsp; if not exists (select 1 from t where id = 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert into t(id, update_time) values(1, getdate())<br/>&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update t set update_time = getdate() where id = 1<br/></div><br/>那么 MySQL 中如何实现这样的逻辑呢？别着急！MySQL 中有更简单的方法： replace into<br/><div class="code"><br/>replace into t(id, update_time) values(1, now());<br/></div><br/>或<br/><div class="code"><br/>replace into t(id, update_time) select 1, now();<br/></div><br/><br/>replace into 跟 insert 功能类似，不同点在于：replace into 首先尝试插入数据到表中， 1. 如果发现表中已经有此行数据（根据主键或者唯一索引判断）则先删除此行数据，然后插入新的数据。 2. 否则，直接插入新数据。<br/><br/>要注意的是：插入数据的表必须有主键或者是唯一索引！否则的话，replace into 会直接插入数据，这将导致表中出现重复的数据。<br/>MySQL replace into 有三种形式：<br/><div class="code"><br/>1. replace into tbl_name(col_name, ...) values(...)<br/>2. replace into tbl_name(col_name, ...) select ...<br/>3. replace into tbl_name set col_name=value, ...<br/></div><br/>前两种形式用的多些。其中 “into” 关键字可以省略，不过最好加上 “into”，这样意思更加直观。另外，对于那些没有给予值的列，MySQL 将自动为这些列赋上默认值。 
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] MySQL：讨人喜欢的 MySQL replace into 用法（insert into 的增强版）]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>