【发布时间】: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