존재하지 않는 경우 MySql 테이블 삽입 그렇지 않으면 업데이트


105
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

datenum존재 하면 작동 하지만 datenum존재하지 않으면 이 데이터를 새 행으로 삽입하고 싶습니다 .

최신 정보

datenum은 고유하지만 기본 키가 아닙니다.


2
"datenum"은 고유합니까? INSERT ... ON DUPLICATE KEY UPDATE를 사용할 수 있습니다 .
Jacob

답변:


143

Jai는 INSERT ... ON DUPLICATE KEY UPDATE.

datenum은 고유 키이므로 업데이트 절에 포함 할 필요가 없으므로 변경해서는 안됩니다. 테이블의 다른 모든 열을 포함해야합니다. VALUES()함수를 사용하여 다른 열을 업데이트 할 때 적절한 값이 사용되는지 확인할 수 있습니다 .

다음은 INSERT ... ON DUPLICATE KEY UPDATEMySQL에 적절한 구문을 사용하여 다시 작성된 업데이트입니다 .

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)

18
둘 이상의 고유 키 또는 기본 키가있는 테이블에 대해 테이블에서 INSERT ... ON DUPLICATE KEY UPDATE를 사용할 때주의하십시오. MySQL 문서 에서 가져옴 : 또한 MySQL 5.5.24부터는 하나 이상의 고유 키 또는 기본 키가있는 테이블에 대한 INSERT ... ON DUPLICATE KEY UPDATE 문도 안전하지 않은 것으로 표시됩니다. (버그 # 11765650, 버그 # 58637) 버그 58637 설명 bugs.mysql.com/bug.php?id=58637
광대역

1
만드는 데 필요한 수 있습니다 UNIQUE에 대한 제약 조건을 Timestamp사용하여ALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
Avyakt

@broadband 당신이 사용할 수있는 복합 키를 이 버그를 피하기 위해
카림

16

이것을 사용해보십시오 :

을 지정 하고 이전 행 ON DUPLICATE KEY UPDATEUNIQUE index orPRIMARY KEY , MySQL performs an [UPDATE`] ( http://dev.mysql.com/doc/refman/5.7/en/update.html )에 중복 값을 유발하는 행이 삽입 됩니다. ..

ON DUPLICATE KEY UPDATE절은 쉼표로 구분 된 여러 열 지정을 포함 할 수 있습니다.

를 사용하면 ON DUPLICATE KEY UPDATE행이 새 행으로 삽입 된 경우 행당 영향을받는 행 값은 1, 기존 행이 업데이트 된 경우 2, 기존 행이 현재 값으로 설정된 경우 0입니다. mysqld에 연결할 때 CLIENT_FOUND_ROWS플래그를 지정하면 기존 행이 현재 값으로 설정된 경우 영향을받는 행 값은 1 (0이 아님)입니다.mysql_real_connect()


하지만 내 datenum은 기본 키가 아닙니다.
OHLÁLÁ

그래서 제 경우에는 해결책이 무엇인지, 어떤 해결책도없이 이것을 시도했습니다 .INSERT INTO forwind.aggregateddata (datenum, Timestamp, Min_F1_baro_20_) VALUES ( '1', '2', '3') ON DUPLICATE KEY UPDATE datenum = datenum;
OHLÁLÁ

1
datenum은 고유해야합니까? 그렇다면 고유 인덱스를 추가하는 것보다 (아직 추가하지 않은 경우) 그러면 작동합니다. UNIQUE 인덱스를 광고하는 방법은 dev.mysql.com/doc/refman/5.1/en/alter-table.html 을 참조하십시오
Jai

이제 datenum을 고유 한 것으로 정의했고 정상적으로 작동합니다. 감사합니다
OHLÁLÁ

1
링크 만 있으면 답을 줄 수도 있습니다.
Andrew

0

UNIQUE 제약 조건을 설정할 수없는 두 필드 (두 외래 키)에 따라 테이블을 업데이트하거나 삽입해야하는 상황이있었습니다 (따라서 INSERT ... ON DUPLICATE KEY UPDATE가 작동하지 않습니다). 내가 사용한 결과는 다음과 같습니다.

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

이 예제는 입력 매개 변수 (두 개의 이름과 숫자)가 [hasher_name], [hash_name] 및 [new_value]로 대체 된 제 데이터베이스 중 하나에서 작성되었습니다. 중첩 된 SELECT ... LIMIT 1은 기존 레코드 또는 새 레코드 중 첫 번째 레코드 (last_recogs.id는 자동 증가 기본 키임)를 가져 와서 REPLACE INTO의 값 입력으로 사용합니다.


REPLACE는 항상 새 행을 삽입합니다! 기존의 원본 만 삭제합니다!
jasie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.