web-dev-qa-db-ja.com

存在しない場合はMySql Table Insert、そうでない場合は更新

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

datenumが存在する場合は機能しますが、datenumが存在しない場合、このデータを新しい行として挿入します。

更新

datenumは一意ですが、それは主キーではありません

91
OHLÁLÁ

JaiはINSERT ... ON DUPLICATE KEY UPDATEを使用する必要があることは正しいです。

Datenumは一意のキーであるため、updatenumにdatenumを含める必要がないため、変更しないでください。テーブルの他のすべての列を含める必要があります。 VALUES() 関数を使用して、他の列を更新するときに適切な値が使用されるようにすることができます。

MySQL用の適切なINSERT ... ON DUPLICATE KEY UPDATE構文を使用して書き換えられた更新は次のとおりです。

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

this を使用してみてください:

ON DUPLICATE KEY UPDATEを指定し、UNIQUE 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です。 CLIENT_FOUND_ROWSフラグを mysql_real_connect() に指定する場合 mysqld に接続する場合、影響を受ける行の値は1です(0ではない)既存の行が現在の値に設定されている場合...

14
Jai

UNIQUE制約を設定できない2つのフィールド(両方の外部キー)に従ってテーブルを更新または挿入する必要がある状況がありました(したがって、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;

この例は、入力パラメーター(2つの名前と数字)を[hasher_name]、[hash_name]、および[new_value]に置き換えて、私のデータベースの1つから引用しています。ネストされたSELECT ... LIMIT 1は、既存のレコードまたは新しいレコードのいずれか(last_recogs.idは自動インクリメントの主キー)の最初を取得し、それをREPLACE INTOへの値入力として使用します。

1
salfter