특정 조건이 충족되는 경우 INSERT
및 ON 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
필드는 업데이트되지 않습니다. 그 이유는 두 번째IF
이last_event_created_at
으로 업데이트되어last_event_created_at
이VALUES(last_event_created_at)
과 같도록 업데이트 되었기 때문입니다. 미친, 응?!
질문에 혼란 스럽습니다. 귀하의 질의는 귀하가 원하는 것을 수행하는 것 같습니다. –
열의 순서를 제어 할 수 없기 때문에 조건을 두 번 평가하고 싶지 않습니다. 그리고이 예제를 통해 마지막 열이 업데이트되어야 함을 알 수 있습니다. 그렇지 않으면 잘못된 값으로 테이블을 독살하게됩니다. – Nick
누가 "-1"을 주었습니까? 설명없이 downvote하는 것은 쓸모가 없습니다. 앞으로도 내가 생각하는 실수를 저 지르지는 않을 것입니다. – Nick