<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無責(zé)任的爛筆頭

    Concentrate & enjoy!
    posts - 3, comments - 15, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    萬無一失的id獲取方法(MySQL)?

    Posted on 2010-04-11 02:54 BZ 閱讀(464) 評(píng)論(0)  編輯  收藏 所屬分類: MySQL
      看代碼:
       public static function saveTheater($theater, $country, $dbConn) {
                $insertSql = sprintf('INSERT IGNORE INTO theaters(name, address, country, latitude, longitude, tel) VALUES (%s, %s, %s, %f, %f, %s)', 
                                    DBUtils
    ::escape($theater->name, $dbConn), 
                                    DBUtils
    ::escape($theater->address, $dbConn),
                                    DBUtils
    ::escape($country, $dbConn),
                                    
    $theater->latitude, $theater->longitude,
                                    DBUtils
    ::escape($theater->tel, $dbConn));
                DBUtils
    ::execute($insertSql, $dbConn);
                
    $theaterId = mysql_insert_id($dbConn);
                
    if ($theaterId == 0) { //conflict, others saved it. we need get the theater by querying
                    $query = sprintf('SELECT id FROM theaters FORCE INDEX(theaters_I1) WHERE name=%s AND address=%s AND country=%s', 
                                     DBUtils
    ::escape($theater->name, $dbConn), 
                                   DBUtils
    ::escape($theater->address, $dbConn),
                                   DBUtils
    ::escape($country, $dbConn));
                  
    $resultSet = DBUtils::execute($query, $dbConn);
                     
    if ($row = mysql_fetch_assoc($resultSet)) {
                         
    $theaterId = $row['id'];
                     }
                }
                
                
    return $theaterId;
            }
      這段代碼從邏輯上講,無懈可擊--數(shù)據(jù)庫中沒有數(shù)據(jù)的話,插入, 然后獲取自增的id。如果這個(gè)值為0, 那么表示數(shù)據(jù)已經(jīng)存在數(shù)據(jù)庫中了,從而執(zhí)行一個(gè)Query操作,取得需要的id。如果從SQL的角度來看,可能執(zhí)行的兩條SQL是: 

    INSERT IGNORE INTO theaters(name, address, country, latitude, longitude, tel) VALUES ("Vue Cinemas - Cheshire Oaks", "Ellesmere Port, Coliseum Way, Chesire Oaks Outlet Village, South Wirral CH65 9HD, United Kingdom", "GB", 53.306521-2.914062, "0871 224 0240")

    SELECT id FROM theaters FORCE INDEX(theaters_I1) WHERE name="Vue Cinemas - Cheshire Oaks" AND address="Ellesmere Port, Coliseum Way, Chesire Oaks Outlet Village, South Wirral CH65 9HD, United Kingdom" AND country="GB"

      看上去很完美,不是嗎?這里還有一個(gè)例外(可能有多個(gè),但這里指出一個(gè)), 這個(gè)例外與unique index有關(guān)。
      如果數(shù)據(jù)庫中已經(jīng)存在了這樣一條記錄: 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)), 那么這個(gè)例外就出現(xiàn)了。
      第一條SQL語句執(zhí)行不會(huì)成功, 因?yàn)槿绻迦氤晒?那么unique index的約束將被破壞--要插入的記錄和已有記錄在unique index語義下是相同的。有意思的是, 第二條SQL同樣找不到數(shù)據(jù),因?yàn)閿?shù)據(jù)庫中沒有一條記錄它滿足條件(address=....條件得不到滿足)。
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲香蕉成人AV网站在线观看 | 国产成人精品亚洲2020| 日韩免费的视频在线观看香蕉 | 精品亚洲A∨无码一区二区三区| 久久久WWW成人免费精品| 国产午夜亚洲精品午夜鲁丝片| 美女视频黄.免费网址| 免费一级毛片在级播放| 特a级免费高清黄色片| 国产亚洲精久久久久久无码AV| 91成人免费福利网站在线| 国产AV无码专区亚洲A∨毛片| 日韩免费电影网站| 亚洲一区无码中文字幕乱码| 成人免费视频一区| 国产精品亚洲专区无码牛牛| 亚洲第一成人影院| 免费国产午夜高清在线视频| 亚洲成人高清在线观看| 日韩免费观看的一级毛片| 国产精品免费久久| 午夜影视日本亚洲欧洲精品一区 | 国产在线国偷精品免费看| 中文字幕亚洲乱码熟女一区二区| 国内永久免费crm系统z在线| 亚洲综合精品一二三区在线| 日韩av无码成人无码免费| 日本系列1页亚洲系列| 国产亚洲福利精品一区| 成年人免费的视频| 美女尿口扒开图片免费| 亚洲乱码中文字幕综合 | 在线观看亚洲网站| 亚洲啪啪AV无码片| 男女做羞羞的事视频免费观看无遮挡 | 免费在线看片网站| 最近2019年免费中文字幕高清| 亚洲性无码AV中文字幕| 久久久久亚洲av成人无码电影| 久久ww精品w免费人成| 美女尿口扒开图片免费|