2016-09-03 1 views
0

특정 조건이 충족되는 경우 INSERTON DUPLICATE KEY은 전체 행을 어떻게 업데이트합니까? 이 더 오래된 경우 row을 업데이트하고 표에서 date_added을 업데이트하고 싶습니다.INSERT ... 중복 키 업데이트 행 IF IF_ADDATE> VALUES (날짜 _ 추가)

이 글을 본 적이

:

https://thewebfellas.com/blog/conditional-duplicate-key-updates-with-mysql

INSERT INTO daily_events 
    (created_on, last_event_id, last_event_created_at) 
VALUES 
    ('2010-01-19', 23, '2010-01-19 10:23:11') 
ON DUPLICATE KEY UPDATE 
    last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id), 
    last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at); 

하지만이 문을 작성하는 유연한 방법이 아니다.

나중에 편집 :

첫째, 조건은 조건 열을 업데이트하는 라인의 위치에주의를 지불해야하기 때문에의 마지막 위치에, 두 번째 업데이트 될 것입니다 각 필드에 대해 평가되기 때문에 그 진술. 그렇지 않으면 UPDATE에 오류가 발생합니다.

것이 더 정확하기 위해, 나는 또한 유효 나는 두 개의 UPDATE 라인을 반전 한이 문장을, 싶어 :

INSERT INTO daily_events(created_on, last_event_id, last_event_created_at) VALUES('2010-01-19', 23, '2010-01-19 10:23:11') ON DUPLICATE KEY UPDATE last_event_created_at = GREATEST(last_event_created_at, VALUES(last_event_created_at)), last_event_id = (CASE WHEN last_event_created_at < VALUES(last_event_created_at) THEN VALUES(last_event_id) ELSE last_event_id END);

이 할 수없는 이유는

이 접근법을 사용할 때 유의해야 할 점은 필드를 업데이트하는 순서가 매우 중요하다는 것입니다. 나는 전체 쿼리가 MySQL에 의해 해석 된 후에 하나의 대량 할당에서 업데이트가 발생했다는 인상을 잘못 받고있었습니다. 하지만 그들은 그렇지 않습니다. 할당은 쿼리에 나타나는 순서대로 이루어집니다.

update을 최신 이벤트와 함께 실행하면 last_event_created_at 필드가 업데이트되지만 last_event_id 필드는 업데이트되지 않습니다. 그 이유는 두 번째 IFlast_event_created_at으로 업데이트되어 last_event_created_atVALUES(last_event_created_at)과 같도록 업데이트 되었기 때문입니다. 미친, 응?!

+0

질문에 혼란 스럽습니다. 귀하의 질의는 귀하가 원하는 것을 수행하는 것 같습니다. –

+0

열의 순서를 제어 할 수 없기 때문에 조건을 두 번 평가하고 싶지 않습니다. 그리고이 예제를 통해 마지막 열이 업데이트되어야 함을 알 수 있습니다. 그렇지 않으면 잘못된 값으로 테이블을 독살하게됩니다. – Nick

+0

누가 "-1"을 주었습니까? 설명없이 downvote하는 것은 쓸모가 없습니다. 앞으로도 내가 생각하는 실수를 저 지르지는 않을 것입니다. – Nick

답변

1

귀하의 검색어가 원하는대로 처리되는 것으로 보입니다. 따라서이 질문을 완전히 이해하지 못했습니다. 당신은 GREATEST()를 사용하여 단순화 수 있습니다

INSERT INTO daily_events(created_on, last_event_id, last_event_created_at) 
    VALUES('2010-01-19', 23, '2010-01-19 10:23:11') 
ON DUPLICATE KEY UPDATE 
    last_event_id = (CASE WHEN last_event_created_at < VALUES(last_event_created_at) THEN VALUES(last_event_id) ELSE last_event_id END), 
    last_event_created_at = GREATEST(last_event_created_at, VALUES(last_event_created_at)); 

이 ( CASE의 사용은 해당 기능에 대한 ANSI 표준을 선호합니다.)

MySQL은이 때 모든 업데이트 '라고 할 수있는 방법을 제공하지 않습니다 이 조건이 충족됩니다 ".

+0

마지막으로 조건이있는 열 (이 경우 'date_added' 열)을 유지해야한다는 요구를 없애려고합니다. 이 문장을 Perl에서 사용하고 특정 열을 감지하여 문장의 마지막 줄에 코드를 작성하면 Perl 코드가보기 흉하고 길고 비효율적이게됩니다. – Nick

+0

더 정확히 말하면, 'INSERT INTO daily_events (created_on, last_event_id, last_event_created_at) VALUES ('2010-01-19', 23, '2010-01-30')이 문은 두 개의 'UPDATE' 10시 23분 11초 19 ') DUPLICATE KEY UPDATE ON last_event_created_at = GREATEST (last_event_created_at, VALUES (last_event_created_at)) last_event_id = (CASE WHEN last_event_created_at Nick

관련 문제