2015년 12월 22일 화요일

[MySQL] INSERT INTO ... DUPLICATE KEY UPDATE & REPLACE INTO

1) REPLACE INTO


REPLACE INTO `TABLE_NAME`
VALUE (col_value1, col_value1, col_value1);

> 데이터 col_value1, col_value2, col_value3를 TABLE에 삽입한다.
중복된 레코드는 삭제 후 삽입한다. (주의! auto_increment 증가함)

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test; 
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)


REPLACE INTO ... SELECT 도 가능하다.

REPLACE INTO `TABLE1`
SELECT col_name1, col_name2, col_name3
FROM `TABLE2`
WHERE where_condition

> TABLE2의 데이터 중 where_condition에 매칭하는 데이터만을 TABLE1에 삽입한다.
중복되면 삭제 후 삽입한다.

주의!

REPLACE를 사용하려면 테이블에 인덱스가 존재하여야 한다.

REPLACE makes sense only if a table has a PRIMARY KEY or UNIQUE index. Otherwise, it becomes equivalent to INSERT, because there is no index to be used to determine whether a new row duplicates another. )

참고 URL:
http://dev.mysql.com/doc/refman/5.7/en/replace.html


2) INSERT INTO ... ON DUPLICATE KEY UPDATE


인덱스에 의해 중복되는 레코드의 삽입을 진행할 경우 INSERT INTO는 에러를 발생시킨다. 하지만 INSERT IN ... ON DUPLICATE KEY UPDATE는 중복이 발생할 경우 이 레코드에 대해 ON DUPLICATE KEY UPDATE 뒤의 조건에 따라 업데이트를 수행한다.

인덱스 중복이 일어난 경우 다음의 두문장은 동일한 역할을 수행한다.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

여러 컬럼에 대한 명령의 수행도 가능하며 각 값에 조건에 따른 업데이트도 가능하다.

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

위 구문은 아래와 동일한 쿼리이다.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

참고 URL:
http://dev.mysql.com/doc/refman/5.7/en/insert.html
http://dev.mysql.com/doc/refman/5.7/en/insert-select.html
http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html


PS. 
근래 MySQL에 대한 것을 자주 올리네.. 흠..
내가 어쩌다가 이렇게 된거지;;;; 
DB를 직접 만들어쓰던 내가 어쩌다가 이렇게;; 주르륽.. ㅠㅠ
.

댓글 없음:

댓글 쓰기