Вставить в таблицу MySQL или обновить, если существует
Я хочу добавить строку в таблицу базы данных, но если строка существует с тем же уникальным ключом, я хочу обновить строку.
Например,
insert into table (id, name, age) values(1, "A", 19)
Допустим, уникальный ключ id
и в моей базе данных есть строка с id = 1
, В этом случае я хочу обновить эту строку с этими значениями. Обычно это дает ошибку. Если я использую insert IGNORE
он будет игнорировать ошибку, но все равно не будет обновляться.
13 ответов
Использование INSERT ... ON DUPLICATE KEY UPDATE
QUERY:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name="A", age=19
Проверьте ЗАМЕНА
http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE into table (id, name, age) values(1, "A", 19)
При использовании пакетной вставки используйте следующий синтаксис:
INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
name = VALUES (name),
...
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);
INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE SET NAME = "A", AGE = 19;
REPLACE INTO table (id, name, age) VALUES(1, "A", 19);
Все эти решения будут работать в отношении вашего вопроса.
Если вы хотите узнать подробнее об этом утверждении, перейдите по этой ссылке
Попробуйте это:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Надеюсь это поможет.
Попробуй это:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Замечания:
Здесь, если id является первичным ключом, то после первой вставки с id='1'
каждый раз попытка вставить id='1'
обновит имя и возраст, а предыдущее имя возраст изменится.
Если вы хотите сделать non-primary
поля как критерии / условие для ON DUPLICATE
, вы можете сделать UNIQUE INDEX
ключ в этой таблице, чтобы вызвать DUPLICATE
.
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);
И если вы хотите объединить два поля, чтобы сделать его уникальным в таблице, вы можете добиться этого, добавив больше в последний параметр.
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);
Обратите внимание: сначала обязательно удалите все данные с одинаковыми name
а также age
значение в других строках.
DELETE table FROM table AS a, table AS b WHERE a.id < b.id
AND a.name <=> b.name AND a.age <=> b.age;
После этого должен сработать ON DUPLICATE
событие.
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name = VALUES(name), age = VALUES(age)
Просто потому, что я искал здесь это решение, но для обновления из другой идентично структурированной таблицы (в моем случае тестовая БД веб-сайта для живой БД):
INSERT live-db.table1
SELECT *
FROM test-db.table1 t
ON DUPLICATE KEY UPDATE
ColToUpdate1 = t.ColToUpdate1,
ColToUpdate2 = t.ColToUpdate2,
...
Как уже упоминалось, только столбцы, которые вы хотите обновить, должны быть включены после ON DUPLICATE KEY UPDATE
,
Нет необходимости перечислять столбцы в INSERT
или же SELECT
Хотя я согласен, что это, вероятно, лучше практиковать.
При использовании SQLite:
REPLACE into table (id, name, age) values(1, "A", 19)
При условии, что id
является первичным ключом. Или же он просто вставляет другой ряд. Смотрите INSERT (SQLite).
В случае, если вы хотите сохранить старое поле (например: имя). Запрос будет таким:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name=name, age=19;
В моем случае я создал ниже запросы, но в первом запросе, если id
1 уже существует и возраст уже существует, после этого, если вы создаете первый запрос без age
чем значение age
будет никто
REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19
чтобы избежать вышеуказанной проблемы, создайте запрос, как показано ниже
INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19
может это поможет тебе...
Ниже приведены некоторые из возможных подходов:
С использованием
The оператор позволяет вставить одну или несколько строк в таблицу
- Сначала укажите имя таблицы и список столбцов, разделенных запятыми, в круглых скобках после предложения.
- Во-вторых, поместите через запятую список значений соответствующих столбцов в круглые скобки после
VALUES
ключевое слово.
INSERT INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");
С использованиемINSERT INTO
сWHERE NOT EXISTS
пункт
INSERT INTO table_name (column_name_1, column_name_2, column_name_3)
SELECT * FROM (SELECT "col_value_1", "col_value_2","col_value_3") AS tmp_name
WHERE NOT EXISTS (
SELECT column_name2 FROM table_name WHERE column_name = "sample_name"
) LIMIT 1;
С использованиемREPLACE INTO
REPLACE
работает точно так же, какINSERT
, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или индекса UNIQUE, старая строка удаляется перед вставкой новой строки.
REPLACE INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Также не забудьте позаботиться об ограничении уникального ключа.
ALTER TABLE `table` ADD UNIQUE `unique_key` ( `id` )