2013-06-13 5 views
2

меня Таблицы T1 и еженедельно, как показано ниже:REPLACE INTO и дублированием UPDATE не работает

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; 

Но этот запрос добавляет новую запись в еженедельную таблицу и не заменяет ее. Что не так?

+0

У вас есть порядок полей смешались в запросе. –

+1

Во-первых, без первичного ключа вы не можете ожидать, что 'ON DUPLICATE KEY' будет работать. Это очевидно, просто посмотрите на фразу (на дубликат _key_). Во-вторых, я не думаю, что «REPLACE INTO» можно использовать с «ON DUPLICATE KEY», потому что вместо этого пытается использовать строку, сопоставляемую ключами, а также дублирующимся ключом. Таким образом, в этом случае вы поручаете MySQL выполнять две операции слияния. – marekful

+0

@ MarcellFülöp: Нужно ли быть «ПЕРВИЧНЫМ» или просто «УНИКАЛЬНЫМ»? –

ответ

1

Вам нужны ключи для замены, чтобы работать так, как вы планируете.

REPLACE работает точно так же, как INSERT, за исключением, что если старая строка в таблице имеет то же значение, что и новая строка для первичного ключа или уникального индекса, старая строка удаляется перед вставкой новой строки. См. Раздел 13.2.5, «Синтаксис INSERT».

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

Смежные вопросы