2013-05-26 55 views
0

我瞭解預處理語句是如何工作的,我需要插入200萬行,所以在這種情況下,使用預準備語句對我來說是最好的選擇。我的問題是我在row2和row3上有一個複合唯一鍵,所以我可以在準備好的語句中使用ON DUPLICATE KEY UPDATE,但是如果我希望使用條件,並且只有在最後更新的DATE在比較日期之前更新時纔會更新?如果沒有準備好的語句,我可以在ON DUPLICATE KEY UPDATE中使用一個簡單的IF,但是我似乎無法用預處理語句實現它,因爲變量已被綁定,並且將在創建預處理語句後在循環中進行設置。MYSQL PHP編寫語句

$link = new mysqli(db_host,db_user,db_pass,db_db); 
if($link->connect_errno){ 
echo "Failed to connect to MySQL."; 
} 

if(!($stmt = $link->prepare("INSERT INTO table(`id`,`lastupdated`,`col1`,`col2`,`col3`,`col4`,`col5`,`col6`,`col7`,`col8`,`col9`) VALUES (?,?,?,?,?,?,?,?,?,?,?)"))){ 
echo "Prepare failed: (" . $link->errno . ") " . $link->error; 
} 
+0

如果你可以使用普通的語句中的'IF',你應該能夠做同樣的事情在準備好的聲明。顯示試圖做這個廣告的代碼告訴我們你得到的錯誤。 – Barmar

+0

如果你不得不加載數百萬條記錄,而且它不是一個反覆發生的事情,我會說看看'LOAD DATA INFILE'的mysql語法會快很多。 – Orangepill

回答

0

values()功能,可以在這種情況下使用,我相信,因爲它會返回通過佔位符在查詢執行傳遞的實際值。

或者你可以簡單地綁定同一個值兩次,第一次爲取值部分和第二的更新

+0

if(!($ stmt = $ link-> prepare(「INSERT INTO productsearch('PROGRAMNAME','LASTUPDATED','NAME','SKU','MANUFACTURER','CATEGORY','CURRENCY','SALEPRICE' ,'PRICE','IMAGEURL','SEARCH')VALUES(?,?,?,?,?,?,?,?,?,?)ON DUPLICATE KEY UPDATE col1 = IF($ lastupdated errno。」)「。 $鏈路>的錯誤; } – RobNHood

+0

問題是因爲變量綁定$ lastupdated不會做任何事因爲在preapared IF子句中 – RobNHood

+1

您應該用佔位符替換'$ lastupdated',並像其他值一樣綁定它們。 – Barmar