【问题标题】:REPLACE INTO and ON DUPLICATE UPDATE is not workingREPLACE INTO 和 ON DUPLICATE UPDATE 不起作用
【发布时间】:2013-06-14 01:25:10
【问题描述】:

我有如下表 T1 和每周表:

CREATE TABLE T1 (
  C1 varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  C2 varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
);

CREATE TABLE weekly (
  C1 varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  C2 varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  year year(4) DEFAULT NULL,
  week int(11) NOT NULL DEFAULT '0',
  count int(11)
);

基本上,我想每年和每周按 c1、c2 分组所有值的总和。需要将这些值存储到“每周”表中。此查询应每天运行,如果条目已存在则替换。

所以我尝试使用替换成。

replace into weekly select year(timestamp) as year,  week(timestamp) as week, C1, C2,  count(*) as count  from T1  where timestamp >= 20130606 and timestamp <= 20130613 group by C1,C2;

但是这个查询是在每周表中添加新条目而不是替换它。怎么了?

【问题讨论】:

  • 您在查询中混淆了字段的顺序。
  • 首先,没有主键,你不能指望ON DUPLICATE KEY 工作。这很明显,只要看看这个短语(在重复的 key 上)。其次,我认为REPLACE INTO 不能与ON DUPLICATE KEY 一起使用,因为replace 尝试对键匹配的行以及重复键进行操作。因此,在这种情况下,您将指示 MySQL 执行两个冲突操作。
  • @MarcellFülöp:需要PRIMARY,还是只需UNIQUE
  • 好问题!我认为主要但同样适用于独特也是有意义的。

标签: mysql


【解决方案1】:

您需要用于替换的密钥才能按您的意愿工作。

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。请参阅第 13.2.5 节,“INSERT 语法”。

https://dev.mysql.com/doc/refman/5.5/en/replace.html

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2011-01-29
    • 2020-07-20
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2017-02-21
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多