MySql таблица Insert если не существует в противном случае обновление
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
это работает, если datenum
существует, но я хочу вставить эти данные в качестве новой строки, если datenum
не существует.
обновление
datenum уникален, но это не первичный ключ
3 ответа:
Jai правильно, что вы должны использовать
INSERT ... ON DUPLICATE KEY UPDATE
.обратите внимание, что вам не нужно включать datenum в предложение update, так как это уникальный ключ, поэтому он не должен меняться. Вам нужно включить другие столбцы из таблицы. Вы можете использовать
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)
попробуйте использовать этой:
если указать
ON DUPLICATE KEY UPDATE
, и вставляется строка, которая приведет к дублированию значения вUNIQUE index or
первичный ключ, MySQL performs an [
обновление'] (http://dev.mysql.com/doc/refman/5.7/en/update.html) из старого ряда...The
ON DUPLICATE KEY UPDATE
предложение может содержать несколько назначений столбцов, разделенных запятыми.С
ON DUPLICATE KEY UPDATE
, значение затронутых строк в строке равно 1, если строка вставлена как новая строка, 2 если существующая строка обновляется, и 0, если существующая строка имеет свои текущие значения. Если вы укажетеCLIENT_FOUND_ROWS
флагmysql_real_connect()
при подключении к mysqld, значение затронутых строк равно 1 (не 0), если существующая строка имеет свои текущие значения...
У меня была ситуация, когда мне нужно было обновить или вставить в таблицу в соответствии с двумя полями (оба внешних ключа), на которых я не мог установить уникальное ограничение (так что вставьте ... На дубликат ключа обновление не будет работать). Вот что я в конечном итоге использовал:
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]. Вложенный выбор...Предел 1 тянет первый из либо существующая запись или новая запись (last_recogs.id является первичным ключом autoincrement) и использует его в качестве значения, вводимого в REPLACE INTO.