MySQL 의 Replace into 와 Insert into on duplicate key update 의 진정한 차이 점

다음 예 를 보 세 요:1 Replace into...1.1 원본 데이터 mysql>use test 입력;Database changedmysql>
mysql> CREATE TABLE t1 SELECT 1 AS a, 'c3' AS b, 'c2' AS c;ALTER TABLE t1 CHANGE a a INT PRIMARY KEY AUTO_INCREMENT ;Query OK, 1 row affected (0.03 sec)Records: 1  Duplicates: 0  Warnings: 0
 
mysql> INSERT INTO t1 SELECT 2,'2', '3';Query OK, 1 row affected (0.01 sec)Records: 1  Duplicates: 0  Warnings: 0mysql> insert into t1(b,c) select 'r2','r3';Query OK, 1 row affected (0.08 sec)Records: 1  Duplicates: 0  Warnings: 0
 
1.2 동작 mysql>REPLACE INTO t1(a,b)VALUES(2,'a')를 대체 하기 시작 합 니 다.Query OK, 2 rows affected (0.06 sec)

【】여기 보 세 요.replace,여기 보 세 요.a=2 의 기록 중 c 필드 는 빈 문자열 입 니 다.따라서 key 와 충돌 할 때 replace 는 관련 필드 를 덮어 쓰 고 다른 필드 는 기본 값 을 채 웁 니 다.중복 key 의 기록 을 삭제 하고 기록 을 새로 삽입 하 는 것 으로 이해 할 수 있 습 니 다.delete 기 존 기록 재 insert 작업 입 니 다.
1.3 메 인 키 에 대한 autoincrement 에 영향 이 있 는 지 없 는 지 다음 테스트 해 보 겠 습 니 다.
 
【】여기 서 알 수 있 듯 이 새로운 자 증 은 4 에서 시작 하 는 것 이 아니 라 5 에서 시작 하여 repalce 조작,메 인 키 의 auto 를 나타 낸다.increment 는 1 을 누적 합 니 다.그래서 다음 과 같이 요약 합 니 다.
key 가 없 을 때 replace 는 일반적인 insert 에 해당 합 니 다.key 가 있 을 때 중복 key 의 기록 을 삭제 하 는 것 으로 이해 할 수 있 습 니 다.key 가 변 하지 않 는 상태 에서 delete 기 존 기록,insert 새로운 기록,신기록 의 값 은 replace 문장의 필드 값 만 입력 하고 나머지 replace 문장의 필드 가 없 으 면 기본 값 을 자동 으로 채 웁 니 다.
2.1 ok,다시 보기 Insert into....on duplicate key update,
mysql> insert into t1(b,c) select 'r4','r5'; 
Query OK, 1 row affected (0.05 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r2 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec)
【】a=5 시 에 원래 의 c 값 이 있 습 니 다.이것 은 key 가 가끔 뒤에 있 는 udate 조작 문 만 실행 하 는 것 을 의미 합 니 다.
2.2 재 검 autoincrement 상황..
mysql> insert into t1(a,b) select '3','r5' on duplicate key update b='r5'; 
Query OK, 2 rows affected, 1 warning (0.19 sec) 
Records: 1 Duplicates: 1 Warnings: 1 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec)
【】여기 서 알 수 있 듯 이 새로운 증 가 는 6 부터 가 아니 라 7 부터 시작 하여 하나의 Insert..on deplicate udate 조작,메 인 키 의 auto 를 나타 낸다.increment 도 replace 처럼 1 을 누적 합 니 다.
2.3 키 가 없 을 때 insert..on deplicate update 의 상황 을 살 펴 보 자
mysql> insert into t1(a,b) select '3','r5' on duplicate key update b='r5'; 
Query OK, 2 rows affected, 1 warning (0.19 sec) 
Records: 1 Duplicates: 1 Warnings: 1 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
+---+----+----+ 
4 rows in set (0.00 sec) 

mysql> insert into t1(b,c) select 'r6','r7'; 
Query OK, 1 row affected (0.19 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> select * from t1; 
+---+----+----+ 
| a | b | c | 
+---+----+----+ 
| 1 | c3 | c2 | 
| 2 | a | | 
| 3 | r5 | r3 | 
| 5 | r4 | r5 | 
| 7 | r6 | r7 | 
+---+----+----+ 
5 rows in set (0.00 sec) 
a=33 의 기록 을 보고 ok,모두 입력 했 습 니 다.
3.위의 테스트 결 과 를 통 해 알 수 있 듯 이 공통점:(1)키 가 없 을 때 replace 는 insert..on deplicate udpate 와 같 습 니 다.(2),key 가 있 을 때 메 인 키 값 을 유지 하고 autoincrement 자동+1 차이 점:key 가 있 을 때 replace 는 delete 오래된 기록 이 고 새로운 기록 을 입력 하기 때문에 기 존의 모든 기록 이 삭 제 됩 니 다.이 럴 때 replace 문장의 필드 가 완전 하지 않 으 면 기 존의 예 를 들 어 c 필드 의 값 은 자동 으로 기본 값 으로 채 워 집 니 다.      insert..deplicate update 는 update 태그 후의 sql 만 실행 합 니 다.이미지 로 볼 때 간단 한 update 구문 에 해당 합 니 다.      하지만 사실 제 추측 으로 는 간단 한 update 문구 라면 autoincrement 는+1 이 되 지 않 습 니 다.먼저 delete 하고 insert 의 동작 일 것 입 니 다.insert 과정 에서 update 뒤의 필드 를 제외 한 모든 필드 의 값 을 유지 할 뿐 입 니 다. 그래서 이들 의 차 이 는 하나 입 니 다.insert.on deplicate udpate 는 모든 필드 의 오래된 값 을 보류 하고 덮어 쓴 다음 에 같이 insert 를 넣 습 니 다.replace 는 오래된 값 을 보류 하지 않 고 다시 insert 새 값 을 삭제 합 니 다. 바 텀 실행 효율 로 볼 때 replace 는 insert.on deplicate update 보다 효율 이 높 지만 replace 를 쓸 때 필드 를 모두 써 서 오래된 필드 데이터 가 삭제 되 는 것 을 방지 해 야 합 니 다.
개인 적 인 성향 과 Replace.

좋은 웹페이지 즐겨찾기