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を使用できます。
ジェイコブ、

回答:


143

Jaiはあなたが使うべきだというのは正しいですINSERT ... ON DUPLICATE KEY UPDATE

datenumは一意のキーであるため、更新句に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ステートメントも安全でないとマークされています。(Bug#11765650、Bug#58637) Bug 58637の説明bugs.mysql.com/bug.php?id=58637
ブロードバンド

1
作成するために必要になる可能性がある UNIQUEため、制約をTimestamp使用してALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
Avyakt

@broadband 複合キーを使用してこのバグを回避できます
カリーム

16

これを使っみてください:

を指定し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になります。mysqldCLIENT_FOUND_ROWSへのmysql_real_connect()接続時にフラグをto に指定すると、既存の行が現在の値に設定されている場合、影響を受ける行の値は1(0ではない)になります...


しかし、私の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が機能しない)2つのフィールド(両方の外部キー)に従ってテーブルを更新または挿入する必要がある状況がありました。これが私が最終的に使用したものです:

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;

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


REPLACEは常に新しい行を挿入します!元の既存のものを削除するだけです!
ジェシー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.