如何使用Foreach循环Php添加ON DUPLICATE KEY UPDATE

时间:2018-03-25 08:06:17

标签: php mysql on-duplicate-key

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

这是我的表:

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

CONSTRAINT UC_sma UNIQUE (reg_date)

答案 1 :(得分:0)

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