Подтвердить что ты не робот

Таблица MySql Вставить, если не существует иное обновление

UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

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

ОБНОВЛЕНИЕ

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

4b9b3361

Ответ 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.