code

표 2에서 표 1 업데이트(새로 삽입, 업데이트만 변경, 누락 제거)

starcafe 2023. 7. 22. 10:18
반응형

표 2에서 표 1 업데이트(새로 삽입, 업데이트만 변경, 누락 제거)

비슷한 질문을 수십 번 했지만, 제 시나리오는 전혀 없었습니다.

csv에서 가져온 임시 테이블(table2)을 기반으로 현재 테이블(table1)을 업데이트하고자 합니다.

  1. 누락된 항목appids
  2. 새로 추가appids
  3. 갱신하다name그것이 바뀌었더라면

또한 업데이트 후 트리거가 2개 있습니다(그 덕분에 단순히 손상된 코드로 실행되는 것이 아니라 내가 무엇을 하고 있는지 알게 되었습니다).

  1. 기록 테이블의 로그 업데이트(표 3)
  2. 로그 기록 테이블에서 삭제(표 3)

현재 다음과 같은 작업을 수행하고 있습니다.

CREATE TEMPORARY TABLE table2 (
    appid INT,
    name VARCHAR(255)
    );
LOAD DATA LOCAL INFILE "outp.csv" INTO TABLE table2 
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n';

UPDATE table1
INNER JOIN table2 ON table2.appid = table1.appid
SET table1.name = table2.name;

DROP TEMPORARY TABLE table2;

현재 기록 테이블은 업데이트를 실행할 때마다 기존의 모든 행을 가져오고 새 행은 가져오지 않으며 누락된 행은 제거되지 않습니다.

원하는 업데이트 작업을 수행하는 올바른 방법은 무엇입니까?


편집: 사실 아래 GMB에서 제공하는 정확한 문구로 진행하는 것이 더 말이 되었습니다.삽입문이 어떻게 작동하는지 알게 된 후, 삽입문은 삽입과 업데이트를 모두 하나로 수행하므로 세 번째 불필요한 문을 실행하지 않아도 되는 것이 더 이치에 맞습니다.

참조용 기존의 세 가지 문 스크립트:

DELETE FROM table1
WHERE NOT EXISTS(
    SELECT 1
    FROM table2
    WHERE table2.appid = table1.appid
    );

UPDATE table1 INNER JOIN table2 ON table2.appid = table1.appid
SET table1.name = table2.name
WHERE table1.name <> table2.name;

INSERT INTO table1 (appid, name)(
    SELECT table2.appid, table2.name FROM table2
    LEFT JOIN table1 ON table2.appid = table1.appid
    WHERE table1.appid IS NULL
    );

당신은 그것을 하나의 진술에서 할 수 없습니다.일부 다른 데이터베이스와 달리 MySQL/MariaDB는 완전한 기능을 제공하지 않습니다.merge진술.

그러나 두 단계로 작업을 수행할 수 있습니다. 먼저 대상에서 "누락된" 행을 제거한 다음 다음insert ... on duplicate key새 행과 기존 행을 삽입/업데이트하려면:

delete from table1 
where not exists(select 1 from table2 where table2.appid = table1.appid)

insert into table1 (appid, name)
select appid, name
from table2
on duplicate key update name = values(name)

이것은 물론, 그것을 가정합니다.id의 기본 키입니다.table1(그래서)insert문장은 중복 항목을 적절하게 식별할 수 있습니다.또한 다음을 정의하는 것이 좋습니다.id임시 테이블의 주요 키로table2이렇게 하면 쿼리 속도가 빨라집니다.

언급URL : https://stackoverflow.com/questions/62214729/update-table1-from-table2-insert-new-update-changed-only-remove-missing

반응형