2009-03-30 3 views
23

Своего странного, чтобы выразить словами, что короткие, хе.Создать, если запись не существует, в противном случае обновление?

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

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

ответ

22

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

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

См. Больше в документе MySQL documentation

+0

Это создало больше, чем при вводе для REPLACE INTO SET SET ip = '$ uip', lastcheck = '$ tim' – unrelativity

+0

IS IP или lastcheck либо первичный ключ, либо уникальный индекс? – carl

+0

Ожидается, что поведение, которое вы испытываете. Для этого одно поле должно быть первичным или уникальным. В противном случае, как MySQL знал бы, чтобы предотвратить дубликаты? Кажется, что вы должны иметь user_id в этой таблице (в качестве первичного ключа), который вы также установили при замене. – carl

2

Посмотрите REPLACE в руководстве по MySQL.

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет такое же значение, как новая строка для PRIMARY KEY или UNIQUE индекса, старый строка удаляется перед новым строка - . См. Раздел 12.2.5, «INSERT Синтаксис».

REPLACE - это расширение MySQL для стандарта SQL . Он либо вставляет, либо удаляет и вставляет. Для другого MySQL расширение стандартного SQL - это либо вставки, либо обновления - см. Section 12.2.5.3, «INSERT ... ON DUPLICATE KEY UPDATE Syntax».

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

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

Это ЗАМЕНИТЬ запрос вы должны запустить:

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

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

INSERT INTO таблицы (а, б, в) ЗНАЧЕНИЯ (4,5,6) ПО DUPLICATE KEY UPDATE с = 9;

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

INSERT INTO таблицы (а, б, в) VALUES (4,5,6) ON DUPLICATE KEY UPDATE 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).

+4

ИМО, этот ответ лучше отвечает на вопрос. Если вы действительно хотите UPDATE, когда строка уже существует, REPLACE является разрушительной: «REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE index, старая строка удаляется до того, как будет вставлена ​​новая строка ». (Руководство по MySQL) – richardkmiller

+3

+1: гораздо лучший ответ, чем принятый ответ – mathieu

+0

Обратите внимание, что это не совсем «Вставка или обновление», но «Вставка или удаление + Вставка», что означает, что это не является правильным решением, если вы хотели обновить только часть столбцов: в отличие от Update, значение столбцов без заданных значений будет установлено в значение по умолчанию (и будет потеряно). –

8

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

Смежные вопросы