Я искал вокруг, но не нашел, если это возможно.
У меня есть этот запрос MySQL:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Идентификатор поля имеет «уникальный индекс», поэтому их не может быть два. Теперь, если такой же идентификатор уже присутствует в базе данных, я бы хотел его обновить. Но нужно ли мне снова указывать все эти поля, например:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Или:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Я уже все указал во вставке ...
Дополнительное примечание, я хотел бы использовать обходной путь, чтобы получить идентификатор!
id=LAST_INSERT_ID(id)
Я надеюсь, что кто-нибудь скажет мне, что является наиболее эффективным способом.
a=VALUES(a), b=VALUES(b), ...
это путь, по которому вам нужно идти. Вот как я делаю это для всех моихINSERT ON DUPLICATE KEY UPDATE
заявлений.Ответы:
Оператор
UPDATE
задан так, что старые поля могут быть обновлены до нового значения. Если ваши старые значения совпадают с новыми, зачем вам нужно обновлять их в любом случае?Например, если ваши колонки
a
кg
уже установлены как2
на8
; не было бы необходимости повторно обновлять его.В качестве альтернативы вы можете использовать:
Чтобы получить
id
отLAST_INSERT_ID
; вам нужно указать приложение для бэкенда, которое вы используете для того же.Для LuaSQL выборка
conn:getlastautoid()
получает значение.источник
tbl
уже есть строка (1,10), то:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
a = 2 . ХотяINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
будет установлено = 10a=a
ничего не используя обновления. (Запросы в исходном вопросе на самом деле тоже ничего не обновляют, но, похоже, именно это обновление и было задумано ОП.)Существует специфическое расширение MySQL для SQL, которое может быть тем, что вы хотите -
REPLACE INTO
Однако он не работает так же, как «ON DUPLICATE UPDATE».
Он удаляет старую строку, которая конфликтует с новой строкой, а затем вставляет новую строку. Пока у вас нет первичного ключа в таблице, это было бы хорошо, но если у вас есть, то если любая другая таблица ссылается на этот первичный ключ
Вы не можете ссылаться на значения в старых строках, поэтому вы не можете сделать эквивалент
Это должно сработать - last_insert_id () должно иметь правильное значение, если ваш первичный ключ имеет автоинкремент.
Однако, как я уже сказал, если вы на самом деле используете этот первичный ключ в других таблицах, он,
REPLACE INTO
вероятно, будет неприемлем для вас, поскольку он удаляет старую строку, которая конфликтовала через уникальный ключ.Кто-то еще предложил, прежде чем вы сможете уменьшить объем печати, выполнив:
источник
replace into
запросом?Другого пути нет, все приходится указывать дважды. Первый для вставки, второй в случае обновления.
источник
Вот решение вашей проблемы:
Я пытался решить проблему, как ваша, и я хочу предложить проверить с простой точки зрения.
Выполните следующие действия: учитесь на простом решении.
Шаг 1. Создайте схему таблицы, используя этот SQL-запрос:
Шаг 2. Создайте индекс из двух столбцов, чтобы избежать дублирования данных, используя следующий SQL-запрос:
или, создайте индекс из двух столбцов из GUI следующим образом:
Шаг 3: Обновите, если существует, вставьте, если не используете следующие запросы:
источник
На всякий случай, если вы можете использовать язык сценариев для подготовки ваших запросов SQL, вы можете повторно использовать пары поле = значение, используя
SET
вместо(a,b,c) VALUES(a,b,c)
.Пример с PHP:
Пример таблицы:
источник
Возможно, вы захотите использовать
REPLACE INTO
синтаксис, но при дублировании ключа PRIMARY / UNIQUE он удаляет строку и вставляет новый.Вам не нужно будет повторно указывать все поля. Тем не менее, вы должны учитывать возможное снижение производительности (зависит от вашей таблицы).
Предостережения:
источник
Я знаю, что уже поздно, но я надеюсь, что кому-то поможет этот ответ
Вы можете прочитать учебник ниже здесь:
источник
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
вы можете использовать вставку игнорировать для такого случая, он будет игнорировать, если он получает дубликаты записей INSERT IGNORE ...; - без ключа дубликата
источник