2013-12-10 135 views
1

我想在我的mySQL數據庫中存儲一對多的關係,並且我想盡可能避免重複的條目。簡單的重複密鑰更新?

我在網上閱讀並看到'ON DUPLICATE KEY UPDATE'是一個選項。這是否適合我的情況?

CODE:

function insert_options($uid, $array) { 
    if(!is_array($array)) { 
     return false; 
    } 
    $db = db_connect(); 
    foreach($array as $a) { 
     $sql = 'INSERT INTO newsletter_coupon_codes_options (uid, option_name, value) VALUES (?, ?, ?)'; 
     $stmt = $db->prepare($sql); 
     if($stmt === false) { 
      echo "Prepare failed: (" . $db->errno . ") " . $db->error; 
     } 
     $stmt->bind_param('iss', $uid, $a, $value); 
     $value = '1'; 
     $stmt->execute(); 
    } 
} 

UID(INT11), OPTION_NAME(varchar(255)), VALUE(INT(11)) 

我嘗試添加ON DUPLICATE KEY UPDATE value = 1$sql聲明,但它似乎沒有做任何事情。基本上我想確保當我插入數據時,如果存在uidoption_name,它只是將value設置爲1,並且不會創建新條目。

我沒有設置唯一密鑰,只有uid上的主密鑰。我不知道做什麼獨特。我無法使uid具有唯一性,因爲每個uid將會有多個條目。我也不能使option_name獨一無二,因爲將有多個相同的option_name uid

什麼是最好的方法來實現這一目標?

+0

您是否在該表中添加了唯一密鑰.. – Sundar

+0

@Sundar> Nope。我只有一個「uid」的PK。我不知道做什麼獨特。我不能使'uid'唯一,因爲每個'uid'都會有多個條目。我也不能使'option_name'唯一,因爲對於多個'uid'將會有相同的'option_name'。你能推薦一些東西嗎? – tr3online

+0

您應該使用唯一密鑰來更新條目。主鍵查找速度更快,因此您可以在決定插入或更新後首先檢查重複檢查過程。但主鍵也支持重複更新http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Sundar

回答

2

查詢更改爲

INSERT INTO newsletter_coupon_codes_options (uid, option_name, value) 
VALUES (?, ?, ?) 
ON DUPLICATE KEY UPDATE value = VALUES(value) 

這裏是SQLFiddle演示

And 確認,您在(uid, option_name)(例如,)上有UNIQIEPRIMARY KEY約束。

ALTER TABLE newsletter_coupon_codes_options 
    ADD UNIQUE (uid, option_name); 
+0

'(uid,option_name)'的約束恰好是我不知道和正在尋找的東西。謝謝! – tr3online

+0

@ tr3online你很受歡迎。祝你好運 :) – peterm

0

請改變你這樣的查詢和使用mysqli_query函數執行此kindof查詢和使用mysqli_real_escape_string功能,避免SQL注入

$sql = 'INSERT INTO newsletter_coupon_codes_options 
    (uid, option_name, value) VALUES ("'.$uid.'", "'.$option_name.'", "'.$value.'") 
    ON DUPLICATE KEY UPDATE value = "'.$value.'"'; 
+1

- 1提示使用查詢字符串插值,而不是使用預處理語句 – peterm

+0

'ON DUPLICATE KEY UPDATE'子句格式錯誤 –

+0

@maček,peterm謝謝 – Sundar