Что вы можете использовать:
То, что вы выбираете, зависит от ваших потребностей. Вероятно, вы будете использовать несколько способов, когда у вас будет «много»
Правильно, что 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)
Попробуйте использовать 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
может содержать несколько назначений столбцов, разделенных запятыми.С
blockquote>ON DUPLICATE KEY UPDATE
значение затронутых строк в строке равно 1, если строка вставлена как новая строка, 2, если существующая строка и 0, если существующая строка установлена на ее текущие значения. Если вы указываете флагCLIENT_FOUND_ROWS
наmysql_real_connect()
при подключении к mysqld , значение affected-rows равно 1 (не 0), если существующая строка установлена на его текущие значения ...
У меня была ситуация, когда мне нужно было обновить или вставить в таблицу в соответствии с двумя полями (оба внешних ключа), на которых я не мог установить ограничение 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.
UNIQUE
дляTimestamp
с помощьюALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
– Avyakt 19 January 2015 в 20:13