2013-12-10 138 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