2012-07-24 98 views
1

我嘗試創建一個簡單的SQL INSERT否則UPDATE語句,但說實話,我不知道是什麼即時通訊做MySQL在重複鍵多個更新

這裏是我的功能,至今

function addInventoryBook($isbn, $sku, $price, $quantity, $condition, $dateOpened){ 
    $q = "INSERT INTO ".TBL_INVENTORY." VALUES('$isbn', '$sku', $price, 
    $quantity, '$condition', $dateOpened) 
    ON DUPLICATE KEY UPDATE VALUES('$isbn', '$sku', $price, $quantity, 
    '$condition', $dateOpened)";  

    return mysql_query($q, $this->connection);   
} 

一這似乎是更新價格領域正在

function addInventoryBook($isbn, $sku, $price, $quantity, $condition, $dateOpened){ 
    $q = "INSERT INTO ".TBL_INVENTORY." VALUES('$isbn', '$sku', $price, 
    $quantity, '$condition', $dateOpened) 
    ON DUPLICATE KEY UPDATE price = $price";  

    return mysql_query($q, $this->connection);   
} 
+1

嘗試'在重複鍵更新設置價格=價值(價格),SKU =價值(SKU),數量= VALUES(數量)。 ....',您可能需要在「.TBL_INVENTORY」之間添加字段名稱。和VALUES。 – Vatev 2012-07-24 18:06:14

+0

在運行之前'echo'您的查詢,確保它實際上是您的想法。 – Crontab 2012-07-24 18:14:48

+0

@Crontab在 – 2012-07-24 18:16:25

回答

5

我會寫這樣的,而不是提供每個值的第二時間:

ON DUPLICATE KEY UPDATE 
    isbn  = VALUES(isbn) 
    sku  = VALUES(sku) 
    price  = VALUES(price) 
    quantity = VALUES(quantity) 
    condition = VALUES(condition) 
    dateOpened = VALUES(dateOpened) 

(這將分配一個會被插入的值,如果插入已成功)。

(您可能不希望將值分配給由插入違反的「唯一」鍵組成的列;我在這裏列出了所有的列,因爲這就是你在嘗試中顯示的內容。)

+1

+它也可以用於多行 – Vatev 2012-07-24 18:18:03

+0

+1,用於比mysql文檔更具有啓發性的答案 – 2012-07-24 18:22:32

+0

@Vatev:這種模式對於插入多行的語句有很好的作用。 (這個答案和你作爲評論留下的答案是一樣的;我提高了你的評論,如果你離開一個,我會提高你的答案。) – spencer7593 2012-07-24 18:22:56

2

Assuimg TBL_INVENTORY先前的功能是與列值的字符串:

$q = "INSERT INTO ".TBL_INVENTORY." VALUES('$isbn', '$sku', $price,  $quantity, '$condition', $dateOpened) ON DUPLICATE KEY UPDATE isbn='$isbn', sku='$sku', price='$price', quantity='$quantity', condition='$condition', dateOpened='$dateOpened'"; 

參考鏈接:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+0

您不必在查詢的更新部分中包含每個字段。 – Crontab 2012-07-24 18:15:50

+0

你會怎麼做? – mlishn 2012-07-24 18:17:19

+0

我的觀點可能是提問者只想在更新條件下更新價格。 – Crontab 2012-07-24 18:18:42