【问题标题】:On duplicate key update - increase by 2在重复密钥更新时 - 增加 2
【发布时间】:2014-10-04 20:13:31
【问题描述】:

我正在将搜索词插入数据库,当我运行它进行测试时,我看到重复插入到数据库中。我能够解决这个问题,但是,现在我正在插入,它不再作为副本插入,但我试图让 on duplicate 工作 - 并且 on duplicate 每次都会将流行度更新 2?我这里有什么问题?

$entryDate = date("c");
$insertsearchquery="insert into article_searches (termSafe,entryDate) values (\"$termSafe\",\"$entryDate\") on duplicate key update popularity=popularity+1";

mysql_query($insertsearchquery);

我为 termSafe 和 entryDate 设置了唯一键。

TABLE `article_searches` (
`id`  bigint(20) NOT NULL AUTO INCREMENT ,
`termSafe` varchar(150) ,
`entryDate`  varchar(255),
`popularity` tinyint(6) UNSIGNED NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `termSafe` USING BTREE (`termSafe`),
UNIQUE INDEX `entryDate` USING BTREE (`entryDate`)
)

虽然我只是删除了 entryDate 唯一索引。

【问题讨论】:

    标签: php mysql sql insert duplicates


    【解决方案1】:

    我猜这是因为您有一个 UNIQUE (termSafe) 和 UNIQUE (entryDate),也许您只想要一个 UNIQUE (termSafe,entryDate)。

    请记住,mysql_* 函数已被弃用。您应该改用 PDO 或 mysqli_*

    【讨论】:

      【解决方案2】:

      尝试删除两个唯一索引并仅创建一个:

       create unique index idx_article_searches_termSafe_EntryDate on article_searches(termSafe, EntryDate);
      

      使用on duplciate key update 时,当检测到多个唯一约束违规时,行为可能定义不明确。我认为它会更新两次,每个约束一次。

      Here 是文档中的警告:

      一般来说,您应该尽量避免使用 ON DUPLICATE KEY UPDATE 具有多个唯一索引的表上的子句。

      【讨论】:

      • 当我创建那个唯一索引时,我得到一个错误,我的最大密钥长度是 1000 字节。即使我在 entryDate 上删除 UNIQUE - 它仍然会将受欢迎程度更新 2。
      • @雅各布。 . .您应该编辑问题并将表定义放入其中。如果键确实需要超过 1000 个字节长,那么您遇到了唯一索引的问题。但是,如果它适用于一列,那么日期应该只有 4 或 8 个字节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2014-10-31
      • 2018-06-24
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多