2015-07-25 6 views
1

У меня есть основная таблица, которую я использую в своем приложении t_media. Набор данных из внешнего источника, который обновляется каждый день. Я загружаю набор данных во временную таблицу t_media_temp каждый день. Мне нужно сделать три вещи:
объединить запросы INSERT/DELETE/UPDATE в один

  • вставить запись из t_media_temp в t_media, если он уже не существует
  • обновить запись в t_media если дата отличается t_media_temp
  • Удалить запись из t_media, если его нет в t_media_temp

В текущей ситуации я использую 3 запроса ниже, но есть ли простой способ объединить его в один запрос?

/* Insert */ 
INSERT INTO t_media (`col_1`, `col_2`, `col_3`, `col_x`) 
SELECT (`col_1`, `col_2`, `col_3`, `col_x`) 
FROM t_media_temp AS t1 
WHERE NOT EXISTS ( 
    SELECT * FROM t_media AS t2 
    WHERE t1.col_1 = t2.col_1 
) 

/* Update */ 
UPDATE t_media, t_media_temp SET 
    t_media.col_1 = t_media_temp.col_1, 
    t_media.col_2 = t_media_temp.col_2, 
    t_media.col_3 = t_media_temp.col_3, 
    t_media.col_x = t_media_temp.col_x 
WHERE 
    t_media.col_1 = t_media_temp.col_1 
AND 
    t_media.col_2 != t_media_temp.col_2 

/* Delete */ 
DELETE FROM t_media WHERE col_1 NOT IN (SELECT col_1 FROM t_media_temp) 

col_1 всегда уникальное значение в таблице.

+0

почему логика вокруг 't_media. col_2! = t_media_temp.col_2' отсутствует в запросе на вставку? – M0rtiis

ответ

2

Согласно документации https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Вы можете смешивать INSERT и UPDATE, как это:

INSERT INTO t_media (`col_1`, `col_2`, `col_3`, `col_x`) 
SELECT (`col_1`, `col_2`, `col_3`, `col_x`) 
FROM t_media_temp AS t1 
ON DUPLICATE KEY UPDATE 
    t_media.col_2 = t1.col_2, 
    t_media.col_3 = t2.col_3, 
    t_media.col_x = t3.col_x 

Но нет никакого способа, чтобы смешивать INSERT или UPDATE с DELETE

+0

Является ли col_1 автоматически распознанным как дубликат ключа? И есть еще одно условие ... Он должен быть обновлен, только col_2 не соответствует. –

+0

@web_student yes, col_1 будет автоматически распознаваться как обман, если его уникальный ключ (или его часть). abut col_2 я спросил раньше. почему мы не видим обходного пути в вашем запросе INSERT? это любой ключ в структуре таблицы? можете ли вы публиковать оригинальные имена полей, а не col_X? – M0rtiis

+0

Что значит обходной путь в запросе INSERT? Существует только один уникальный идентификатор, который является col_1. Все остальные значения могут быть не уникальными. Таблица состоит из 50 + столбцов. –

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