2014-03-20 4 views
2

У меня есть следующий запрос:SQL - IF EXISTS UPDATE ELSE INSERT

INSERT INTO distance (deviceID,datum,tavolsag) 
SELECT 
deviceID, DATE(FROM_UNIXTIME(timestamp)) as datum, 
sum(case when distanceKM/1000<416 then distanceKM/1000 else 0 end) as tavolsag 
FROM eventdata 
GROUP BY datum,deviceID; 

Я хотел бы знать, как можно избежать дублирования данных при запуске запроса на ежедневной основе/или использовать «, если существует обновление еще insert ".

Thx

ответ

0

Если у вас есть UNIQUE ограничение на (DeviceId, нулевой точки), то вы можете использовать INSERT ... ON DUPLICATE KEY

INSERT INTO distance (deviceID, datum, tavolsag) 
SELECT d.deviceID 
    , DATE(FROM_UNIXTIME(d.timestamp)) as datum 
    , SUM(CASE WHEN d.distanceKM/1000<416 
       THEN d.distanceKM/1000 
       ELSE 0 END 
     ) AS tavolsag 
    FROM eventdata d 
GROUP BY datum, deviceID 
ON DUPLICATE KEY 
UPDATE tavolsag = VALUES(tavolsag) 

При выполнении этого оператора, это попытается вставить, и если вставка нарушит уникальное ограничение ключа, вместо того, чтобы выкидывать ошибку, MySQL будет выполнять UPDATE вместо эквивалента:

UPDATE distance 
    SET tavolsag = ? 
WHERE device_id = ? 
    AND datum  = ? 

Если имеется несколько уникальных ограничений, то действие зависит от того, ограничение уникальности помечен как нарушается. Фактическое обновление, которое будет выполнено, будет относиться к уникальному ограничению, которое вызвало бы ошибку.

+0

благодарит вас за разъяснение! deviceId и datum являются уникальным ограничением. – Peter

+0

@Peter: еще одно примечание: если ваша целевая таблица имеет определенный столбец AUTO_INCREMENT, то выполнение инструкции 'INSERT ... ON DUPLICATE KEY' будет записываться через значения auto_increment, даже если оператор выполняет действие UPDATE. Сначала MySQL пытается сначала ввести INSERT (и тогда, когда он использует значение AUTO_INCREMENT), а затем возвращается к UPDATE только при дублировании ключевого исключения. – spencer7593

0

попробовать это:

INSERT INTO distance (deviceID,datum,tavolsag) 
SELECT deviceID,datum,tavolsag from(select 
deviceID, DATE(FROM_UNIXTIME(timestamp)) as datum, 
sum(case when distanceKM/1000<416 then distanceKM/1000 else 0 end) as tavolsag 
FROM eventdata 
GROUP BY datum,deviceID)t 
on duplicate key update set datum=......, tavolsag = ..... 
+0

Большое спасибо, однако теперь я получаю синтаксическую ошибку в deviceID, DATE (FROM_UNIXTIME (timestamp)) как datum, – Peter

+0

Я знаю, что я только что отредактировал :), i forgeot the select :) –

+0

Большое вам спасибо! – Peter

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