Таблица MySql Вставить, если не существует иное обновление
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
Он работает, если существует datenum
, но я хочу вставить эти данные в новую строку, если datenum
не существует.
ОБНОВЛЕНИЕ
ноль уникален, но не первичный ключ
Ответы
Ответ 1
Jai правильно, что вы должны использовать INSERT ... ON DUPLICATE KEY 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)
Ответ 2
Попробуйте использовать this:
Если вы укажете 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, если существующая строка установлена на ее текущие значения. Если вы указываете флаг CLIENT_FOUND_ROWS
на mysql_real_connect()
при подключении к mysqld, значение затронутых строк равно 1 (не 0), если существующая строка установлена на ее текущие значения...
Ответ 3
У меня была ситуация, когда мне нужно было обновлять или вставлять таблицу в соответствии с двумя полями (оба внешних ключа), на которых я не мог установить ограничение 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.