MySql Table Insert, если не существует, обновите
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
Это работает, если datenum
существует, но я хочу вставить эти данные в виде новой строки, если datenum
не существует.
ОБНОВИТЬ
datenum уникален, но это не первичный ключ
4 ответа
Джай правильно, что вы должны использовать 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 [
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), если для существующей строки заданы текущие значения...
Это не так уж плохо, но мы могли бы объединить все в один запрос. В интернете находил разные решения. Самый простой, ноMySQL only solution
это:
INSERT INTO wp_postmeta (post_id, meta_key)
SELECT
?id,
‘page_title’
FROM
DUAL
WHERE
NOT EXISTS (
SELECT
meta_id
FROM
wp_postmeta
WHERE
post_id = ?id
AND meta_key = ‘page_title’
);
UPDATE
wp_postmeta
SET
meta_value = ?page_title
WHERE
post_id = ?id
AND meta_key = ‘page_title’;
У меня была ситуация, когда мне нужно было обновить или вставить таблицу в соответствии с двумя полями (оба внешних ключа), для которых я не смог установить ограничение 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.