표 2에서 표 1 업데이트(새로 삽입, 업데이트만 변경, 누락 제거)
비슷한 질문을 수십 번 했지만, 제 시나리오는 전혀 없었습니다.
csv에서 가져온 임시 테이블(table2)을 기반으로 현재 테이블(table1)을 업데이트하고자 합니다.
- 누락된 항목
appid
s - 새로 추가
appid
s - 갱신하다
name
그것이 바뀌었더라면
또한 업데이트 후 트리거가 2개 있습니다(그 덕분에 단순히 손상된 코드로 실행되는 것이 아니라 내가 무엇을 하고 있는지 알게 되었습니다).
- 기록 테이블의 로그 업데이트(표 3)
- 로그 기록 테이블에서 삭제(표 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
'code' 카테고리의 다른 글
한 줄에 try/except를 어떻게 넣어야 합니까? (0) | 2023.07.22 |
---|---|
두 판다 기둥의 끈 연결 (0) | 2023.07.22 |
효율적인 양방향 해시 테이블을 구현하는 방법은 무엇입니까? (0) | 2023.07.22 |
SpringBoot 파일 업로드 크기 제한이 Multipart 가져오기를 초과하는 경우최대 업로드 크기 대신 예외 발생초과됨예외. (0) | 2023.07.22 |
DB2와 Oracle의 차이점 (0) | 2023.07.22 |