MySQL: как добавить IF EXISTS, затем UPDATE Else INSERT? [Дубликат]

Что вы можете использовать:

  1. передавать данные между действиями (например, Cristian said)
  2. , используя класс с множеством статических переменных (чтобы вы могли их вызывать без экземпляр класса и без использования getter / setter)
  3. Использование базы данных
  4. Общие настройки

То, что вы выбираете, зависит от ваших потребностей. Вероятно, вы будете использовать несколько способов, когда у вас будет «много»

82
задан OHLÁLÁ 17 May 2011 в 12:50
поделиться

3 ответа

Правильно, что 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)
116
ответ дан Ike Walker 19 August 2018 в 04:43
поделиться
  • 1
    Будьте внимательны при использовании INSERT ... ON DUPLICATE KEY UPDATE в таблицах с таблицей, содержащей более одного уникального или первичного ключа. Взято из документации по MySQL : Кроме того, начиная с MySQL 5.5.24, инструкция INSERT ... ON DUPLICATE KEY UPDATE для таблицы, содержащей более одного уникального или первичного ключа, также отмечена как небезопасный. (Ошибка № 11765650, ошибка № 58637) Описание ошибки 58637 bugs.mysql.com/bug.php?id=58637 – broadband 2 September 2014 в 14:28
  • 2
    Может потребоваться создать ограничение UNIQUE для Timestamp с помощью ALTER TABLE AggregatedData ADD UNIQUE (Timestamp) – Avyakt 19 January 2015 в 20:13

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

13
ответ дан gnat 19 August 2018 в 04:43
поделиться
  • 1
    Но мое число данных не является первичным ключом. – OHLÁLÁ 17 May 2011 в 12:49
  • 2
    Это не требуется .. единственный req - это уникальный ключ. – Jai 17 May 2011 в 12:50
  • 3
    Итак, в моем случае, в чем заключается решение, я пробовал это, без какого-либо решения: INSERT INTO forwind.aggregateddata (дата, время, Min_F1_baro_20_) VALUES ('1', '2', '3') ON DUPLICATE KEY UPDATE datenum = datenum; – OHLÁLÁ 17 May 2011 в 12:57
  • 4
    должно быть уникальным? если да, чем добавить к нему уникальный индекс (если он еще не добавлен). Тогда он будет работать. Обратитесь к dev.mysql.com/doc/refman/5.1/en/alter-table.html за то, как объявлять индексы UNIQUE – Jai 17 May 2011 в 15:01
  • 5
    Просто ссылка, может быть, дать ответ. – Andrew 15 January 2016 в 22:48

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

0
ответ дан salfter 19 August 2018 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: