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.

Другие вопросы по тегам