简单的重复密钥更新


Simple ON DUPLICATE KEY UPDATE?

我正试图在mySQL数据库中存储一对多关系,如果可能的话,我希望避免重复条目。

我在互联网上读到,"on DUPLICATE KEY UPDATE"是一个选项。这对我的情况有用吗?

代码:

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唯一,因为多个uid的将有相同的option_name

实现这一目标的最佳方法是什么?

将查询更改为

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

这是SQLFiddle演示

并且确保您对(uid, option_name)UNIQIEPRIMARY KEY约束,例如

ALTER TABLE newsletter_coupon_codes_options 
  ADD UNIQUE (uid, option_name);

请这样更改您的查询,并使用mysqli_query函数执行此类查询,使用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.'"';