programing

"중복 키 업데이트 시"를 사용할 때 행이 삽입 또는 업데이트되었는지 어떻게 알 수 있습니까?

lovejava 2023. 10. 26. 20:27

"중복 키 업데이트 시"를 사용할 때 행이 삽입 또는 업데이트되었는지 어떻게 알 수 있습니까?

cronjob으로 매일 자정에 업데이트되는 데이터베이스가 있습니다. 외부 XML에서 새로운 데이터를 얻습니다.

우리가 하는 일은 새로운 내용을 모두 삽입하고 중복된 키가 있을 경우 해당 필드를 업데이트하는 것입니다.

INSERT INTO table (id, col1, col2, col3)
values (id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY UPDATE 
col1 = VALUES (col1), 
col2 = VALUES (col2), 
col3 = VALUES (col3);

우리가 알고 싶은 것은 실제로 어떤 행이 삽입되었는지, 즉 새로운 항목의 목록을 갖고 싶다는 것입니다.새 삽입물을 반환할 수 있는 쿼리가 있습니까?기본적으로 우리는 새로운 삽입 횟수가 아니라 새로운 ID를 모두 얻어야 합니다.

감사해요.

삽입/업데이트 시 결과 세트의 영향을 받는 행 수를 조사하여 이 정보를 얻을 수 있습니다.

MySQL 문서에는 다음과 같은 내용이 있습니다.

ON DUFFIC KEY UPDATE를 사용하면 행이 새 행으로 삽입되면 행당 영향을 받는 행 값이 1이고 기존 행이 업데이트되면 2가 됩니다.

ROW_COUNT와 LAST_INSERT_를 결합해야 합니다.답변을 얻고 한 행씩 삽입하기 위한 ID입니다.

추가하기update_count INT NOT NULL DEFAULT 1열을 열고 쿼리를 변경합니다.

INSERT
INTO    table (id, col1, col2, col3)
VALUES
(id_value, val1, val2, val3),
(id_value, val1, val2, val3,),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY
UPDATE 
        col1 = VALUES (col1), 
        col2 = VALUES (col2), 
        col3 = VALUES (col3),
        update_count = update_count + 1;

가 증가할 수도 있습니다.BEFORE UPDATE쿼리를 그대로 유지할 수 있는 trigger입니다.

How I did in PHP:

1) 단순 쿼리 SELECT MAX(id)를 선택하고 중복 삽입 전에 테이블에서 $max_id로 기억합니다.

2) 그런 다음 업데이트 프로세스 중에 영향을 받는 행의 ID를 수집합니다(신규 또는 존재하지 않음).$ids[] = mysql_insert_id ();

3) 그러면 $ inserted_rows = max ($ids) -max_id;

4) 업데이트된 행 = 카운트 ($ids_srt) - inserted_rows

$max_id = mysql_query("SELECT MAX(id) from table");
$max_id = mysql_result($max_id, 0);

// !!! prepare here 'insert on duplicate' query in a cycle

$result=mysql_query($query);
$ids[] = mysql_insert_id();

// finish inserting and collecting affected ids and close cycle

$inserted_rows = max($ids)- $max_id;
$updated_rows = count($ids)- $inserted_rows

언급URL : https://stackoverflow.com/questions/10709380/how-to-know-if-when-using-on-duplicate-key-update-a-row-was-inserted-or-update