MySql Table Insert, если не существует, обновите - PullRequest
90 голосов
/ 17 мая 2011
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

Работает, если datenum существует, но я хочу вставить эти данные в виде новой строки, если datenum не существует.

ОБНОВЛЕНИЕ

datenum уникален, но это не первичный ключ

Ответы [ 3 ]

126 голосов
/ 18 мая 2011

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)
14 голосов
/ 17 мая 2011

Попробуйте использовать 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), если существующая строка установлены текущие значения ...

1 голос
/ 08 ноября 2017

У меня была ситуация, когда мне нужно было обновить или вставить таблицу в соответствии с двумя полями (оба внешних ключа), для которых я не смог установить ограничение 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...