MySql таблица Insert если не существует в противном случае обновление


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

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

обновление

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

3 83

3 ответа:

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)

попробуйте использовать этой:

если указать ON DUPLICATE KEY UPDATE, и вставляется строка, которая приведет к дублированию значения в UNIQUE index or первичный ключ, MySQL performs an [ обновление'] (http://dev.mysql.com/doc/refman/5.7/en/update.html) из старого ряда...

The ON DUPLICATE KEY UPDATE предложение может содержать несколько назначений столбцов, разделенных запятыми.

С ON DUPLICATE KEY UPDATE, значение затронутых строк в строке равно 1, если строка вставлена как новая строка, 2 если существующая строка обновляется, и 0, если существующая строка имеет свои текущие значения. Если вы укажете CLIENT_FOUND_ROWS флаг mysql_real_connect() при подключении к mysqld, значение затронутых строк равно 1 (не 0), если существующая строка имеет свои текущие значения...

У меня была ситуация, когда мне нужно было обновить или вставить в таблицу в соответствии с двумя полями (оба внешних ключа), на которых я не мог установить уникальное ограничение (так что вставьте ... На дубликат ключа обновление не будет работать). Вот что я в конечном итоге использовал:

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]. Вложенный выбор...Предел 1 тянет первый из либо существующая запись или новая запись (last_recogs.id является первичным ключом autoincrement) и использует его в качестве значения, вводимого в REPLACE INTO.