【问题标题】:Simple ON DUPLICATE KEY UPDATE?简单的重复密钥更新?
【发布时间】:2013-12-10 06:21:20
【问题描述】:

我正在尝试在 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

最好的方法是什么?

【问题讨论】:

  • 您是否在该表中添加了唯一键..
  • @Sundar > 不。我只有一个 PK uid。我不确定要做什么独特。我不能让uid 唯一,因为每个uid 会有多个条目。我也不能使option_name 独一无二,因为多个uid 会有相同的option_name。你能推荐一些东西吗?
  • 您应该使用唯一键来更新条目。主键查找速度更快,因此您可以在决定插入或更新后首先检查重复的过程。但主键也支持重复更新dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
  • 你想要ON DUPLICATE KEY UPDATE value = VALUES(value)

标签: php mysql sql-insert on-duplicate-key


【解决方案1】:

将您的查询更改为

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);

【讨论】:

  • (uid, option_name) 上的约束正是我不知道并且正在寻找的。谢谢!
【解决方案2】:

请像这样更改您的查询并使用 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.'"';

【讨论】:

  • -1 建议使用查询字符串插值,这会导致 sql 注入,而不是使用准备好的语句
  • ON DUPLICATE KEY UPDATE 子句格式错误
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2018-06-24
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2013-06-19
  • 2017-09-30
相关资源
最近更新 更多