MySQL에서 존재하지 않는 경우 (일명 "Upsert"또는 "Merge") 삽입하려면 어떻게해야합니까?
-
10-07-2019 - |
문제
쉬운 방법이 있습니까? 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
. 보다 이 질문 레코드가 이미 존재하는 경우 몇 열 (모든 열이 아닌 모든 열이 아닌) 만 업데이트하려는 경우 일부 해결 방법.