MySQL에서 존재하지 않는 경우 (일명 "Upsert"또는 "Merge") 삽입하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1218905

문제

쉬운 방법이 있습니까? INSERT 존재하지 않을 때 또는 UPDATE 존재하는 경우 하나의 MySQL 쿼리를 사용합니까?

도움이 되었습니까?

해결책

예, INSERT ... ON DUPLICATE KEY UPDATE. 예를 들어:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

다른 팁

나는 이것이 오래된 질문이라는 것을 알고 있지만, Google은 최근에 나를 여기로 이끌어서 다른 사람들도 여기에 온다고 생각합니다.

@chaos는 정확합니다 INSERT ... ON DUPLICATE KEY UPDATE 통사론.

그러나 원래의 질문은 MySQL에 대해 구체적으로 물었고 MySQL에는 REPLACE INTO ... 통사론. IMHO,이 명령은 상향에 사용하기가 더 쉽고 간단합니다. 매뉴얼에서 :

테이블의 기존 행이 기본 키 또는 고유 한 인덱스의 새 행과 동일한 값을 갖는 경우 새 행이 삽입되기 전에 이전 행이 삭제된다는 점을 제외하고 삽입과 같은 작업을 정확하게 교체합니다.

참고 이것은 표준 SQL이 아닙니다. 매뉴얼의 예 :

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

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 좋아하지 않습니다 UPDATE. 매뉴얼이 말했듯이 REPLACE 행이 존재하면 행을 삭제 한 다음 새 제품을 삽입합니다. (위의 예에서 재미있는 "2 줄에 영향을받는 것"에 주목하십시오.) 즉, 그것은 값을 대체합니다. 모두 기존 레코드의 열 (단순히 업데이트가 아닙니다. 약간 열.) MySQL의 동작 REPLACE INTO sqlite의 것과 매우 흡사합니다 INSERT OR REPLACE INTO. 보다 이 질문 레코드가 이미 존재하는 경우 몇 열 (모든 열이 아닌 모든 열이 아닌) 만 업데이트하려는 경우 일부 해결 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top