programing

MySQL에 있는 경우 업데이트하고 없는 경우 삽입(AKA "upsert" 또는 "Merge")하려면 어떻게 해야 합니까?

randomtip 2022. 12. 21. 22:55
반응형

MySQL에 있는 경우 업데이트하고 없는 경우 삽입(AKA "upsert" 또는 "Merge")하려면 어떻게 해야 합니까?

쉽게 할 수 있는 방법은 없을까?INSERT행이 존재하지 않을 때 또는 행UPDATEMySQL 쿼리가 하나라도 있다면?

사용 예:

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

오래된 질문인 건 알지만, 구글이 최근에 저를 여기로 이끌어서 다른 사람들도 여기로 올 거라고 생각해요.

@syslog가 맞습니다.구문이 있습니다.

단, 원래 질문은 MySQL에 대해 구체적으로 물었고 MySQL에는 구문이 있습니다.IMHO, 이 명령어는 상승에 사용하기 쉽고 간단합니다.매뉴얼:

REPLACE는 INSERT와 동일하게 기능하지만 테이블 내의 오래된 행이 PRIMAY KEY 또는 UNIQUIE 인덱스의 새 행과 동일한 값을 갖는 경우 새 행을 삽입하기 전에 오래된 행이 삭제됩니다.

이것은 표준 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 INTOSqlite의 그것과 매우 유사합니다.INSERT OR REPLACE INTO레코드가 이미 존재하는 경우 일부 열(모든 열이 아니라)만 업데이트하려는 경우 이 문제를 해결하려면 이 질문을 참조하십시오.

언급URL : https://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql

반응형