【问题标题】:INSERT... ON DUPLICATE UPDATE if multiple values existINSERT... ON DUPLICATE UPDATE 如果存在多个值
【发布时间】:2020-09-26 13:57:52
【问题描述】:

在执行具有多个值的 INSERT 语句时,我想更新在两个或多个值中包含相同数据的重复条目。

经过一些研究ON DUPLICATE KEY UPDATE 似乎是要走的路。但是,即使在阅读了许多类似的线程之后,我仍然在努力实现它。

我的这个假设是对的吗?如果两行或多行中的值相同,那么替换数据的最佳方法是什么?

我已采取的步骤:

-创建我的数据库

CREATE TABLE IF NOT EXISTS installs (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  username varchar(255)    NOT NULL,
  userid INT UNSIGNED NOT NULL DEFAULT '0',
  email varchar(255)    NOT NULL,
  addontitle varchar(255)    NOT NULL,
  addonversion varchar(255)    NOT NULL,
  bburl varchar(255)    NOT NULL,
  bbtitle varchar(255)    NOT NULL,
  webmasteremail varchar(255)    NOT NULL,
  cookie varchar(255)    NOT NULL,
  dateline INT UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (id),
  KEY userid (userid)
)

-通过 PHP 脚本插入数据:

INSERT INTO installs (
      username,userid,email,addontitle,addonversion,bburl,bbtitle,webmasteremail,cookie,dateline
    ) VALUES (
      '$username','$userid','$email','$addontitle','$addonversion','$bburl','$bbtitle','$webmasteremail','$cookie',NOW()
    )
    ON DUPLICATE KEY UPDATE
    addontitle = VALUES($addontitle)

但这并不能完全得到我需要的结果。

作为一个例子,这里有一些提交的行:

1 - Bob - 25 - bob@test.com - Addon 1 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
2 - Bob - 25 - bob@test.com - Addon 2 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
3 - Bob - 25 - bob@test.com - Addon 2 - 1.2 - site.com - Some Site - admin@test.com - 13 - DATE

如果插入包含以下值,我希望能够更新第 1 行,因为 $bburl$addontitle 匹配。

4 - Bob - 25 - bob@test.com - Addon 1 - 2.0 - test.com - Test Site - admin@test.com - 13 - DATE

那么表格应该是:

1 - Bob - 25 - bob@test.com - Addon 1 - 2.0 - test.com - Test Site - admin@test.com - 13 - NEWDATE
2 - Bob - 25 - bob@test.com - Addon 2 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
3 - Bob - 25 - bob@test.com - Addon 2 - 1.2 - site.com - Some Site - admin@test.com - 13 - DATE

使用ON DUPLICATE KEY UPDATE可以实现这种类型的操作吗?有没有更好的方法?

【问题讨论】:

标签: mysql database insert duplicates sql-update


【解决方案1】:

为了使用ON DUPLICATE KEY UPDATE,您必须创建一个索引来强制bburl, addontitle 两列的唯一性,以便MySQL 能够检测到重复。这将使用名为idx_uniq_bburl_addontitle 的标识符创建索引 `

在您尝试此操作之前,您必须确保您的表中的任何位置都没有多次出现bburl, addontitle 的组合。您可以通过以下方式验证:

-- Check for non-unique rows
SELECT bburl, addontitle FROM installs GROUP BY bburl, addontitle HAVING COUNT(*) > 1

如果没有返回行,则可以成功创建多列索引。

-- Create a multi-column unique index
ALTER TABLE `installs` ADD UNIQUE INDEX `idx_uniq_bburl_addontitle` (`bburl`, `addontitle`);

创建索引后,如果触发了DUPLICATE KEY,您可以使用以下代码更新addonversion

INSERT INTO installs 
  (username,userid,email,addontitle,addonversion,bburl,bbtitle,webmasteremail,cookie,dateline)
  VALUES ('$username','$userid','$email','$addontitle','$addonversion','$bburl','$bbtitle','$webmasteremail','$cookie',NOW())
  ON DUPLICATE KEY UPDATE addonversion = '$addonversion';

更新行的多个值:

ON DUPLICATE KEY UPDATE addonversion = '$addonversion', bbtitle = '$bbtitle';

请注意,您在 SQL 语句中使用 $bburl 等变量表明您没有在代码中将 prepare()/execute() 与 PDO 或 MySQLi 一起使用。我建议查看 How can I prevent SQL injection in PHP 以获取有关如何改善这种情况的建议。

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2015-07-30
    • 2015-11-17
    • 2013-10-03
    • 2011-01-29
    相关资源
    最近更新 更多