programing

삽입...어디에서 중복된 키를 갱신할 때?

kingscode 2022. 9. 20. 21:45
반응형

삽입...어디에서 중복된 키를 갱신할 때?

하고 있어요INSERT ... ON DUPLICATE KEY UPDATE단, 업데이트 부분은 조건부로 해야 하며, 추가 조건이 변경된 경우에만 업데이트를 해야 합니다.

하지만,WHERE이 경우 허용되지 않습니다.UPDATE이 문제를 해결할 방법이 있습니까?

INSERT/UPDATE/SELECT 조합은 복제 작업을 수행해야 하므로 수행할 수 없습니다.

그러기 위해서는 IF()를 사용하는 것이 좋습니다.

참조: 조건부 복제 키업데이트와 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);

이게 우리의 마지막 해결책이야, 마법처럼 효과가 있어!

삽입 ignore는 이 마스터와 슬레이브 둘 다에 존재하는지 확인합니다.

업데이트... 여기서 모든 복제가 완료된 후 가장 최근의 업데이트만 글로벌하게 최종 결과가 됩니다.

mysql> desc test;
+-------+--------------+------+-----+-------------------+-------+
| Field | Type         | Null | Key | Default           | Extra |
+-------+--------------+------+-----+-------------------+-------+
| id    | int(11)      | NO   | PRI | NULL              |       | 
| value | varchar(255) | YES  |     | NULL              |       | 
| ts    | timestamp    | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+--------------+------+-----+-------------------+-------+

mysql> insert ignore into test values (4, "foo", now());    
mysql> update test set value = "foo", ts = now() where id = 4 and ts <= now();

두 개의 삽입문을 사용할 수 있습니다.소스 데이터의 선택 부분에 where 절을 추가할 수 있기 때문입니다.

두 데이터 세트를 선택합니다. 하나는 '복제 시'로 삽입하고 다른 하나는 '복제 시'로 삽입하지 않습니다.

개요

  • AWUpsertCondy가 AFTER로 변경하려고 합니다.

심플화 문제

문제

  • AWUpsertCondy는 MySQL이 중복된 기본 키를 감지하는 경우 삽입 쿼리가 실패하지 않도록 합니다.
  • MySQL은 다음을 포함하는 조건부 WHERE 절을 지원하지 않습니다.ON DUPLICATE KEY UPDATE

솔루션

  • MySQL은 conditional 절을 지원합니다.IF()기능.
  • 여기에서는 사용자 ID가 9 미만인 항목만 갱신하는 간단한 조건이 있습니다.
INSERT INTO zzdemo_table02
    (lname,userid)
  SELECT
    lname,userid
    FROM(
      SELECT
        lname,userid
      FROM
        zzdemo_table01
    ) as tt01
ON DUPLICATE KEY UPDATE
    userid=IF(@doupdate:=IF( (tt01.userid < 9) , True, False), 
        tt01.userid, zzdemo_table02.userid)
    ,lname=IF(@doupdate, tt01.lname , zzdemo_table02.lname )
;

함정

  • MySQL 변수를 소개합니다.@doupdateUPDATE 행이 조건을 충족하는지 여부를 플래그를 지정합니다.그런 다음 UPDATE 문에서 사용하는 모든 데이터베이스 열에 동일한 변수를 사용합니다.
  • 첫 번째 조건에서는 변수를 선언하고 조건이 적용되는지 여부를 결정합니다.이 접근법은 WHERE 조항보다 더 번거롭다고 할 수 있습니다.

「 」를 참조해 주세요.

테이블php_lock:
name: idString,locked:부울,time: 개요,locked_by: 문자열
삽입 또는 갱신할 값
1, CURRENT_TIMESTamp, '스크립트'
어디에name='www' ANDlocked=2

INSERT INTO `php_lock` (`name`, locked, `time`, `locked_by`)  
(SELECT * FROM 
    (SELECT `name`,1,CURRENT_TIMESTAMP, 'script' FROM `php_lock` 
        WHERE `name`='wwww' AND `locked`=2  
    UNION (
    SELECT 'wwww',1 ,CURRENT_TIMESTAMP, 'script') 
) AS temp LIMIT 1) 
ON DUPLICATE KEY UPDATE locked=VALUES(locked), `time`=VALUES(`time`), `locked_by`=VALUES(`locked_by`);

On duplicate keywhere 절을 사용할 수 없도록 합니다.그러므로 두 가지 대안이 있습니다.

  1. 대부분의 시간을 알고 있으면 중복된 키를 얻을 수 있습니다.

    a. Update the table first using update query and where clause b. If update fails then insert the record into table using insert query

  2. 테이블에 삽입할 대부분의 시간을 알고 있는 경우

    a. Insert the record into table using insert ignore query - what it does is actually ignore the insert if duplicate key found b. If insert ignore fails then update the record using update query

여기를 클릭해 주세요.

언급URL : https://stackoverflow.com/questions/2469457/insert-on-duplicate-key-update-with-where

반응형