Создать, если запись не существует, в противном случае обновить? - PullRequest
29 голосов
/ 30 марта 2009

Странно, если выразить это словами, хех.

В любом случае, я хочу в основном обновить запись в таблице, если она существует, в противном случае создать новую, заполнив ее теми же данными.

Я знаю, что это легко, но я относительно новичок в MySQL с точки зрения того, насколько я его использовал: P

Ответы [ 4 ]

67 голосов
/ 30 марта 2009

Многие разработчики все еще выполняют запрос, чтобы проверить, присутствует ли поле в таблице, а затем выполняют запрос вставки или обновления в соответствии с результатом первого запроса. Попробуйте использовать синтаксис ON DUPLICATE KEY, это намного быстрее и лучше, чем выполнение 2 запросов. Более подробную информацию можно найти здесь

ВСТАВИТЬ В СТОЛ (a, b, c) ЗНАЧЕНИЯ (4,5,6) ОБНОВЛЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕЙ c = 9;

если вы хотите сохранить то же значение для c, вы можете выполнить обновление с тем же значением

ВСТАВИТЬ В СТОЛ (a, b, c) ЗНАЧЕНИЯ (4,5,6) ОБНОВЛЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕЙ c = 6;

разница между «заменить» и «на дубликат ключа»:

заменить: вставляет или удаляет и вставляет

на дубликате ключа: вставка или обновление

если в вашей таблице нет первичного или уникального ключа, замена не имеет никакого смысла.

Вы также можете использовать функцию VALUES, чтобы избежать необходимости указывать фактические значения дважды. Например. вместо

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

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

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

Где VALUES(c) будет соответствовать значению, указанному выше (6).

23 голосов
/ 30 марта 2009

Используйте «REPLACE INTO»:

 REPLACE INTO table SET id = 42, foo = 'bar';

Подробнее в документации MySQL

8 голосов
/ 30 марта 2009

Как уже говорили другие, REPLACE - это путь. Просто будьте осторожны, используя его, так как он на самом деле делает DELETE и INSERT на столе. Это нормально в большинстве случаев, но если у вас есть внешние ключи с ограничениями, такими как ON DELETE CASCADE, это может вызвать некоторые большие проблемы.

2 голосов
/ 30 марта 2009

Посмотрите ЗАМЕНИТЕ в руководстве по MySQL.

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для ПЕРВИЧНЫЙ КЛЮЧ или УНИКАЛЬНЫЙ индекс, старый строка удаляется до того, как новая строка вставлено. См. Раздел 12.2.5, «ВСТАВКА» Синтаксис».

REPLACE - это расширение MySQL для Стандарт SQL Он либо вставляет, либо удаляет и вставляет. Для другого MySQL расширение к стандартному SQL - это вставки или обновления - смотрите Раздел 12.2.5.3 , «ВСТАВИТЬ ... ВКЛ» Синтаксис DUPLICATE KEY UPDATE ».

Если у вас есть следующий запрос INSERT:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24)

Это запрос ЗАМЕНЫ, который вы должны выполнить:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...