쿼리 구문으로 바꾸기
"바꾸기" 문을 사용하여 동일한 스키마의 테이블을 업데이트할 수 있기를 원합니다.최종적으로 큰 테이블을 변경 가능한 값으로 갱신할 수 있어야 합니다.
시작하기 위해 사용하는 쿼리는 다음과 같습니다.
REPLACE INTO table_name
(visual, inspection_status, inspector_name, gelpak_name, gelpak_location),
VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01');
데이터베이스 엔진이 중복 행과 중복되지 않은 행을 어떻게 인식하는지 이해할 수 없습니다.이 데이터는 매우 중요하므로 데이터가 손상될 위험을 감수할 수 없습니다.나열된 모든 열의 값이 같으면 중복된 행입니다.와 같이 단순합니까?
1분 안에 45,000개 이상의 행을 갱신할 수 있도록 효율적인 방법을 찾고 있습니다.
설명서에 기재되어 있는 바와 같이:
REPLACE는 INSERT와 동일하게 기능하지만 테이블 내의 오래된 행이 PRIMAY KEY 또는 UNIQUIE 인덱스의 새 행과 동일한 값을 갖는 경우 새 행을 삽입하기 전에 오래된 행이 삭제됩니다.
REPLACE
기능하는 것은,INSERT
같은 것을 가진 레코드를 덮어쓰기만 하면 됩니다.PRIMARY KEY
또는UNIQUE
단, 인덱스는 주의해 주십시오.
Shlomi Noach는 사용상의 문제에 대해 기술합니다.REPLACE INTO
여기:
하지만 나처럼 마음이 약한 사람들은 다음과 같은 것을 알아야 한다: 그것은 무거운 해결책이다.사용하기 쉽다는 점에서는 원하는 대로입니다만, 실제로는 중복된 키에서는 DELETE와 INSERT가 실행되기 때문에, 보다 자세하게 조사할 필요가 있습니다.
행이 삭제될 때마다 모든 인덱스를 업데이트해야 하며, 가장 중요한 것은 PRIMAY KEY입니다.새 행을 삽입하면 동일한 작업이 수행됩니다.특히 InnoDB 테이블(클러스터화 특성 때문에)에서는 오버헤드가 커집니다.지수 구조 조정은 비용이 많이 드는 작업이다.삭제 시 인덱스 노드를 병합해야 할 수 있습니다.INSERT로 인해 노드를 분할해야 할 수 있습니다.여러 번 REPLACE INTO를 실행한 후 SELECT/UPDATE 또는 INSERT IN...을 사용한 경우 인덱스가 예상보다 단편화되었을 가능성이 높습니다.중복 키 ON
또, 「행은 거기에 없으면, 우리가 만든다」라는 개념도 있습니다.거기에 있으면, 간단하게 갱신됩니다」라고 하는 것입니다.이것은 거짓이다.행이 업데이트될 뿐만 아니라 완전히 제거됩니다.문제는 테이블에 프라이머리 키가 있고 REPLACE INTO에 프라이머리 키의 값이 지정되어 있지 않은 경우(예를 들어 AUTO_INCREMENT 컬럼), 새로운 행이 다른 값을 취득하고, 이것이 동작에 관해서 필요한 값이 아닐 수 있다는 것입니다.
REPLACE INTO를 사용하는 대부분의 경우 PRIMAY KEY(또는 다른 고유 키) 값을 변경할 의도가 없습니다.그렇다면 그냥 내버려 두는 게 좋을 거야.지금까지 본 프로덕션 시스템에서는 REPLACE INTO를 변경하여 삽입하는 방법을 본 적이 있습니다.DPLICATE KEY를 켜면 스루풋이 10배 향상되고(초당 쿼리 수로 측정), IO 조작과 부하 평균이 대폭 감소했습니다.
「」입니다.REPLACE INTO
도입에 적합할 수도 있지만 그 대신 사용하는 것이 더 적절하고 위험도 적을 수 있습니다.
뭐 그런 거 있잖아요
insert ignore tbl1 (select * from tbl2);
UPDATE
`tbl1` AS `dest`,
(SELECT * FROM tbl2) AS `src`
SET
dest.field=src.field,
dest.field=if (length(src.field)>0,src.field,dest.field) /* or anything like that*/
WHERE
`dest`.id = `src`.id;
CREATE TEMPORARY TABLE test
(prim INT PRIMARY KEY
,sec INT NOT NULL UNIQUE
,tert INT UNIQUE
,com VARCHAR(255)
);
INSERT INTO test (prim,sec,tert,com)
VALUES (1,2,3,'123')
,(2,3,null,'23n')
,(3,1,null,'31n');
REPLACE INTO test(prim,sec,tert,com)
VALUES (3,3,3,'333');
SELECT *
FROM test;
DROP TEMPORARY TABLE test;
즐거운 시간
언급URL : https://stackoverflow.com/questions/19820724/replace-into-query-syntax
'programing' 카테고리의 다른 글
최대 절전 모드를 사용하는 Mariadb 동적 열 (0) | 2022.11.22 |
---|---|
클래스는 클래스를 확장하고 인터페이스를 구현할 수 있습니까? (0) | 2022.11.22 |
이상한 PHP 오류: '쓰기 컨텍스트에서 함수 반환 값을 사용할 수 없습니다' (0) | 2022.11.22 |
MySQL/MariaDB: 표준 시간대와 함께 날짜 저장 (0) | 2022.11.22 |
변경 시 선택한 파일의 전체 경로를 가져오는 방법변경 시 선택한 파일의 전체 경로를 가져오는 방법javascript, jquery-discript를 사용할까요?javascript, jquery-discript를 사용할까요? (0) | 2022.11.22 |