복붙노트

[SQL] MySQL의에 그렇지 않은 경우 (일명 "upsert"또는 "병합")을 삽입있는 경우 어떻게 업데이트하나요?

SQL

MySQL의에 그렇지 않은 경우 (일명 "upsert"또는 "병합")을 삽입있는 경우 어떻게 업데이트하나요?

그것은 하나의 MySQL의 쿼리를 사용하여, 존재하는 경우는, 또는 UPDATE에 존재하지 않는 행을 삽입 할 수있는 쉬운 방법이 있나요?

해결법

  1. ==============================

    1.예, INSERT ... ON DUPLICATE KEY UPDATE. 예를 들면 :

    예, 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
    
  2. ==============================

    2.나는이 오래된 질문 알아요,하지만 난 다른 사람도 여기에 오는 상상 그래서 구글은 최근 여기에 저를지도한다.

    나는이 오래된 질문 알아요,하지만 난 다른 사람도 여기에 오는 상상 그래서 구글은 최근 여기에 저를지도한다.

    @chaos가 정확한지 다음 INSERT ... ON DUPLICATE KEY UPDATE 구문이 있습니다.

    그러나, 원래의 질문은 REPLACE INTO ... 구문이 특히 MySQL의에 대한 질문, 그리고 MySQL을한다. IMHO,이 명령은 upserts 사용하기 더 쉽고 간단합니다. 수동에서 :

    이 표준 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)
    

    편집 : INTO 교체 그냥 공정한 경고가 UPDATE처럼되지 않습니다. 설명서가 말했듯이 존재하는 경우, 새로운 하나를 삽입, 행 삭제를 교체합니다. (재미있는 위의 예에서 "2 개 행이 영향"참고.) 즉, 그것은 기존 레코드의 모든 컬럼의 값을 대체합니다 (일부 열을 단순히 업데이트하지.) MySQL의의의 동작을 INTO 훨씬의 같다 교체 SQLite는의 INSERT OR REPLACE INTO. 당신은 단지 기록이 이미 존재하는 경우 몇 가지 열 (그리고 모든 열)를 업데이트하려면 몇 가지 해결 방법이 문제를 참조하십시오.

  3. from https://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql by cc-by-sa and MIT license