﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-无责任的烂笔头-文章分类-MySQL</title><link>http://www.blogjava.net/brian/category/44598.html</link><description>Concentrate &amp; enjoy!</description><language>zh-cn</language><lastBuildDate>Sat, 10 Apr 2010 22:40:07 GMT</lastBuildDate><pubDate>Sat, 10 Apr 2010 22:40:07 GMT</pubDate><ttl>60</ttl><item><title>万无一失的id获取方法(MySQL)?</title><link>http://www.blogjava.net/brian/articles/317974.html</link><dc:creator>BZ</dc:creator><author>BZ</author><pubDate>Sat, 10 Apr 2010 18:54:00 GMT</pubDate><guid>http://www.blogjava.net/brian/articles/317974.html</guid><wfw:comment>http://www.blogjava.net/brian/comments/317974.html</wfw:comment><comments>http://www.blogjava.net/brian/articles/317974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/brian/comments/commentRss/317974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/brian/services/trackbacks/317974.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;看代码:<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span><span style="font-size: 13px; "><span style="color: #000000; ">&nbsp;</span></span><span style="font-size: 13px; "><span style="color: #0000FF; ">static</span></span><span style="font-size: 13px; "><span style="color: #000000; ">&nbsp;</span></span><span style="font-size: 13px; "><span style="color: #0000FF; ">function</span></span><span style="font-size: 13px; "><span style="color: #000000; ">&nbsp;saveTheater(</span></span><span style="font-size: 13px; "><span style="color: #800080; ">$theater</span></span><span style="font-size: 13px; "><span style="color: #000000; ">,</span></span><span style="font-size: 13px; "><span style="color: #000000; ">&nbsp;</span></span><span style="font-size: 13px; "><span style="color: #800080; ">$country</span></span><span style="font-size: 13px; "><span style="color: #000000; ">,</span></span><span style="font-size: 13px; "><span style="color: #000000; ">&nbsp;</span></span><span style="font-size: 13px; "><span style="color: #800080; ">$dbConn</span></span><span style="font-size: 13px; "><span style="color: #000000; ">)&nbsp;{</span></span><br />
<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$insertSql</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">sprintf</span><span style="color: #000000; ">(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">INSERT&nbsp;IGNORE&nbsp;INTO&nbsp;theaters(name,&nbsp;address,&nbsp;country,&nbsp;latitude,&nbsp;longitude,&nbsp;tel)&nbsp;VALUES&nbsp;(%s,&nbsp;%s,&nbsp;%s,&nbsp;%f,&nbsp;%f,&nbsp;%s)</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">name</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">)</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">address</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">)</span><span style="color: #000000; ">,</span><span style="color: #000000; "><br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$country</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">)</span><span style="color: #000000; ">,</span><span style="color: #000000; "><br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">latitude</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">longitude</span><span style="color: #000000; ">,</span><span style="color: #000000; "><br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">tel</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">execute(</span><span style="color: #800080; ">$insertSql</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$theaterId</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">mysql_insert_id</span><span style="color: #000000; ">(</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800080; ">$theaterId</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">conflict,&nbsp;others&nbsp;saved&nbsp;it.&nbsp;we&nbsp;need&nbsp;get&nbsp;the&nbsp;theater&nbsp;by&nbsp;querying</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$query</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">sprintf</span><span style="color: #000000; ">(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">SELECT&nbsp;id&nbsp;FROM&nbsp;theaters&nbsp;FORCE&nbsp;INDEX(theaters_I1)&nbsp;WHERE&nbsp;name=%s&nbsp;AND&nbsp;address=%s&nbsp;AND&nbsp;country=%s</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">name</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">)</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$theater</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">address</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">)</span><span style="color: #000000; ">,</span><span style="color: #000000; "><br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">escape(</span><span style="color: #800080; ">$country</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$resultSet</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;DBUtils</span><span style="color: #000000; ">::</span><span style="color: #000000; ">execute(</span><span style="color: #800080; ">$query</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$dbConn</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800080; ">$row</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">mysql_fetch_assoc</span><span style="color: #000000; ">(</span><span style="color: #800080; ">$resultSet</span><span style="color: #000000; ">))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">$theaterId</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$row</span><span style="color: #000000; ">[</span><span style="color: #000000; ">'</span><span style="color: #000000; ">id</span><span style="color: #000000; ">'</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$theaterId</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;这段代码从逻辑上讲，无懈可击--数据库中没有数据的话，插入, 然后获取自增的id。如果这个值为0, 那么表示数据已经存在数据库中了，从而执行一个Query操作,取得需要的id。如果从SQL的角度来看，可能执行的两条SQL是:&nbsp;
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">INSERT</span><span style="color: #000000; ">&nbsp;IGNORE&nbsp;</span><span style="color: #0000FF; ">INTO</span><span style="color: #000000; ">&nbsp;theaters(name,&nbsp;address,&nbsp;country,&nbsp;latitude,&nbsp;longitude,&nbsp;tel)&nbsp;</span><span style="color: #0000FF; ">VALUES</span><span style="color: #000000; ">&nbsp;("Vue&nbsp;Cinemas&nbsp;</span><span style="color: #808080; ">-</span><span style="color: #000000; ">&nbsp;Cheshire&nbsp;Oaks",&nbsp;"Ellesmere&nbsp;Port,&nbsp;Coliseum&nbsp;Way,&nbsp;Chesire&nbsp;Oaks&nbsp;Outlet&nbsp;Village,&nbsp;South&nbsp;Wirral&nbsp;CH65&nbsp;9HD,&nbsp;United&nbsp;Kingdom",&nbsp;"GB",&nbsp;</span><span style="color: #800000; font-weight: bold; ">53.306521</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #808080; ">-</span><span style="color: #800000; font-weight: bold; ">2.914062</span><span style="color: #000000; ">,&nbsp;"</span><span style="color: #800000; font-weight: bold; ">0871</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; font-weight: bold; ">224</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; font-weight: bold; ">0240</span><span style="color: #000000; ">")<br />
<br />
</span><span style="color: #0000FF; ">SELECT</span><span style="color: #000000; ">&nbsp;id&nbsp;</span><span style="color: #0000FF; ">FROM</span><span style="color: #000000; ">&nbsp;theaters&nbsp;FORCE&nbsp;</span><span style="color: #0000FF; ">INDEX</span><span style="color: #000000; ">(theaters_I1)&nbsp;</span><span style="color: #0000FF; ">WHERE</span><span style="color: #000000; ">&nbsp;name</span><span style="color: #808080; ">=</span><span style="color: #000000; ">"Vue&nbsp;Cinemas&nbsp;</span><span style="color: #808080; ">-</span><span style="color: #000000; ">&nbsp;Cheshire&nbsp;Oaks"&nbsp;</span><span style="color: #808080; ">AND</span><span style="color: #000000; ">&nbsp;address</span><span style="color: #808080; ">=</span><span style="color: #000000; ">"Ellesmere&nbsp;Port,&nbsp;Coliseum&nbsp;Way,&nbsp;Chesire&nbsp;Oaks&nbsp;Outlet&nbsp;Village,&nbsp;South&nbsp;Wirral&nbsp;CH65&nbsp;9HD,&nbsp;United&nbsp;Kingdom"&nbsp;</span><span style="color: #808080; ">AND</span><span style="color: #000000; ">&nbsp;country</span><span style="color: #808080; ">=</span><span style="color: #000000; ">"GB"</span></div>
<br />
&nbsp;&nbsp;看上去很完美，不是吗?这里还有一个例外(可能有多个,但这里指出一个), 这个例外与unique index有关。<br />
&nbsp;&nbsp;如果数据库中已经存在了这样一条记录: country=GB, name=Vue Cinemas - Cheshire Oaks, address=Ellesmere Port, Coliseum Way, Chesire Oaks Outlet Village, South Wirral CH65 9HD, United Kingdom12321312321, 表(theaters)的unique index是(country, name, address(64)), 那么这个例外就出现了。<br />&nbsp;&nbsp;第一条SQL语句执行不会成功, 因为如果插入成功,那么unique index的约束将被破坏--要插入的记录和已有记录在unique index语义下是相同的。有意思的是, 第二条SQL同样找不到数据，因为数据库中没有一条记录它满足条件(address=....条件得不到满足)。<br/ />&nbsp;&nbsp;

<img src ="http://www.blogjava.net/brian/aggbug/317974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/brian/" target="_blank">BZ</a> 2010-04-11 02:54 <a href="http://www.blogjava.net/brian/articles/317974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>