Я хочу добавить строку в таблицу базы данных, но если строка существует с тем же уникальным ключом, я хочу обновить строку.
Например:
insert into table (id, name, age) values(1, "A", 19)
Допустим, уникальный ключ есть id
, и в моей базе данных есть строка с id = 1
. В этом случае я хочу обновить эту строку этими значениями. Обычно это дает ошибку.
Если я использую insert IGNORE
его, он будет игнорировать ошибку, но все равно не будет обновляться.
mysql
sql
insert-update
upsert
Keshan
источник
источник
Ответы:
использование
INSERT ... ON DUPLICATE KEY UPDATE
QUERY:
источник
affected row count
приводит к2
успешному обновлению (на дубликате ключа) одной строки? У кого-нибудь еще был такой результат? (Данные обновлены правильно: имеется в виду только 1 строка)ON DUPLICATE KEY UPDATE
увеличивают затронутые строки на 2. Он сообщает 0, если на самом деле ничего не обновляется (то же самое, что и обычноеUPDATE
).Проверьте ЗАМЕНА
http://dev.mysql.com/doc/refman/5.0/en/replace.html
источник
При использовании пакетной вставки используйте следующий синтаксис:
источник
VALUES(name)
не работает, вы можете попробоватьname = 'name_value',...;
Попробуйте это:
Надеюсь это поможет.
источник
Попробуй это:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Примечание.
Здесь, если id является первичным ключом, после первой вставки при
id='1'
каждой попытке вставкиid='1'
обновляются имя и возраст, а предыдущий возраст имени изменяется.источник
Все эти решения будут работать в отношении вашего вопроса.
Если вы хотите узнать подробнее об этом заявлении, перейдите по этой ссылке
источник
REPLACE
не документировано в связанном документе.При использовании SQLite:
При условии, что
id
это первичный ключ. Или же он просто вставляет другой ряд. Смотрите INSERT (SQLite).источник
replace into
означает «вставить или обновить, если есть». @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Просто потому, что я искал здесь это решение, но для обновления из другой идентично структурированной таблицы (в моем случае тестовая БД веб-сайта для живой БД):
Как уже упоминалось, только столбцы, которые вы хотите обновить, должны быть включены после
ON DUPLICATE KEY UPDATE
.Нет необходимости перечислять столбцы в
INSERT
илиSELECT
, хотя я согласен, что это, вероятно, лучшая практика.источник
В случае, если вы хотите создать
non-primary
поля в качестве критерия / условияON DUPLICATE
, вы можете сделатьUNIQUE INDEX
ключ в этой таблице, чтобы вызватьDUPLICATE
.И если вы хотите объединить два поля, чтобы сделать его уникальным в таблице, вы можете добиться этого, добавив больше в последний параметр.
Обратите внимание, просто убедитесь , что для удаления первого всех данных , которые имеют то же самое
name
иage
значение по другим строкам.После этого должно запуститься
ON DUPLICATE
событие.источник
В моем случае я создал следующие запросы, но в первом запросе, если
id
1 уже существует и возраст уже существует, после этого, если вы создадите первый запрос без,age
значение неage
будет равнятьсячтобы избежать вышеуказанной проблемы, создайте запрос, как показано ниже
может это поможет тебе ...
источник
В случае, если вы хотите сохранить старое поле (например, имя). Запрос будет:
источник