1

我正在尝试在我的 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声明中,但它似乎没有做任何事情。基本上我想确保当我插入数据时,如果uidandoption_name存在,它只是设置valueto1并且不会创建新条目。

我没有设置唯一键,只有一个主键uid。我不确定要做什么独特。我无法做到uid唯一,因为每个uid. 我也无法使option_name唯一的,因为多个选项名称将相同uid唯一的,因为多个's

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

4

2 回答 2

2

将您的查询更改为

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

这是SQLFiddle演示

确保你有一个UNIQIEorPRIMARY KEY约束(uid, option_name),例如

ALTER TABLE newsletter_coupon_codes_options 
  ADD UNIQUE (uid, option_name);
于 2013-12-10T06:37:56.917 回答
0

请像这样更改您的查询并使用 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.'"';
于 2013-12-10T06:27:44.840 回答