【问题标题】:How to add ON DUPLICATE KEY UPDATE with a Foreach loop Php如何使用 Foreach 循环 Php 添加 ON DUPLICATE KEY UPDATE
【发布时间】:2018-03-25 08:06:16
【问题描述】:

我一直在尝试将 ON DUPLICATE KEY UPDATE 添加到下面的代码中,但是每次我在 mysql 中插入数据时,数据都会一遍又一遍地添加,而我希望它们是唯一的,因此添加的重复密钥更新。

这是我的桌子:

$sql = "CREATE TABLE sma (
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
short_sma VARCHAR(255) NOT NULL,
mid_sma VARCHAR(255) NOT NULL,
long_sma VARCHAR(255) NOT NULL,
extra_sma VARCHAR(255) NOT NULL,
CONSTRAINT UC_sma UNIQUE (reg_date,short_sma,mid_sma,long_sma,extra_sma)

)";

这是我对 ON DUPLICATE KEY UPDATE 的尝试,但它们都不起作用,即数据被一遍又一遍地添加到我的 SMA 表中。

第一次尝试:

$sql = "INSERT INTO sma (short_sma, mid_sma, long_sma, extra_sma) VALUES ";

foreach ($uniqe_keys as $key) {    

    $short_sma = array_key_exists($key, $short_smas)?$short_smas[$key]:"";
    $mid_sma = array_key_exists($key, $mid_smas)?$mid_smas[$key]:"";
    $long_sma = array_key_exists($key, $long_smas)?$long_smas[$key]:"";
    $extra_sma = array_key_exists($key, $extra_smas)?$extra_smas[$key]:"";
    // here we build comma separated list of value pairs to insert
    $sql .= "('$short_sma', '$mid_sma', '$long_sma', '$extra_sma'),";
}

$sql = rtrim($sql, ",") ;
$sql .= " ON DUPLICATE KEY UPDATE 

  short_sma = '" . $short_sma . "',
  mid_sma = '" . $mid_sma . "',
  long_sma = '" . $long_sma . "',
  extra_sma = '" . $extra_sma . "'

";

第二次尝试:

    $sql = "INSERT INTO sma (short_sma, mid_sma, long_sma, extra_sma) VALUES ";

    foreach ($uniqe_keys as $key) {    

        $short_sma = array_key_exists($key, $short_smas)?$short_smas[$key]:"";
        $mid_sma = array_key_exists($key, $mid_smas)?$mid_smas[$key]:"";
        $long_sma = array_key_exists($key, $long_smas)?$long_smas[$key]:"";
        $extra_sma = array_key_exists($key, $extra_smas)?$extra_smas[$key]:"";
        // here we build comma separated list of value pairs to insert
        $sql .= "('$short_sma', '$mid_sma', '$long_sma', '$extra_sma'),";
    }

$sql = rtrim($sql, ",") . " ON DUPLICATE KEY UPDATE

     short_sma = VALUES(short_sma) , mid_sma = VALUES (mid_sma), long_sma = VALUES(long_sma) , extra_sma = VALUES (extra_sma) ";

感谢您的帮助

【问题讨论】:

  • 您是否考虑过使用唯一约束?
  • 感谢您的回复。我已经在使用唯一约束 - 见表。还是我错过了什么?

标签: php mysql on-duplicate-key


【解决方案1】:

你的约束是错误的。由于您要更新除reg_date 之外的所有值,因此只有它应该是约束的一部分:

CONSTRAINT UC_sma UNIQUE (reg_date)

【讨论】:

  • 感谢您的回复。当我添加 reg_date 时,我的数据库中只剩下一个值,因为我每秒可以有数百个值。此约束布局适用于另一个数据库(reg_date、short_sma、mid_sma、long_sma、extra_sma),因此它可能与 ON DUPLICATE KEY UPDATE 有关。
【解决方案2】:

我得到了我想要的结果,即没有重复值。通过增加: id INT UNSIGNED AUTO_INCREMENT PRIMARY KEYCONSTRAINT UC_sma UNIQUE (price,short_sma,mid_sma,long_sma,extra_sma) 在创建表和第二次尝试代码时。

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 2018-12-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多