UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
場合、それは動作しますdatenum
が存在するが、私は場合は、新しい行としてこのデータを挿入するdatenum
存在しません。
更新
datenumは一意ですが、それは主キーではありません
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
場合、それは動作しますdatenum
が存在するが、私は場合は、新しい行としてこのデータを挿入するdatenum
存在しません。
更新
datenumは一意ですが、それは主キーではありません
回答:
Jaiはあなたが使うべきだというのは正しいですINSERT ... ON DUPLICATE KEY UPDATE
。
datenumは一意のキーであるため、更新句にdatenumを含める必要はないので、変更しないでください。テーブルの他のすべての列を含める必要があります。このVALUES()
関数を使用して、他の列を更新するときに適切な値が使用されていることを確認できます。
これは、INSERT ... ON DUPLICATE KEY UPDATE
MySQLの適切な構文を使用して書き換えた更新です。
INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE
Timestamp=VALUES(Timestamp)
UNIQUE
ため、制約をTimestamp
使用してALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
を指定し
ON DUPLICATE KEY UPDATE
、古い行のUNIQUE index or
PRIMARY 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ではない)になります...
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への値入力として使用します。