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

Возможный дубликат:
Как мне обновить, если существует, вставить, если нет (иначе upsert или merge) в MySQL?

как вставить в базу данных MySQL, если записи уже существуют, то обновить... Я знаю, что есть решение на этой странице: http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

sib_table

+=======================================================+
| sib_id | std_id  |  sib_name  |  sib_sex  |  sib_age  |
+=======================================================+
| 1      | 77      |  Sajjad    |   m       | 5/17/1990 |
| 1      | 77      |  Farah     |   f       | 9/14/1980 |
| 1      | 77      |  Bilal     |   m       | 1/10/1995 |
+=======================================================+

Что такое sql, если я захочу добавить родного брата в эту таблицу.

INSERT INTO sib_table
  (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Sajjad','m','1/5/2010')  
ON DUPLICATE KEY 
  UPDATE id = LAST_INSERT_ID(id), c = 3;

INSERT INTO sib_table
  (std_id,sib_name,sib_sex,sib_age) 
VALUES 
  ('77','Aamna','f','1/27/2005')  
ON DUPLICATE KEY 
  UPDATE id = LAST_INSERT_ID(id), c = 3;

3 ответа

Решение

Вы близки, но вам нужно относиться к ON DUPLICATE KEY пункт так же, как UPDATE заявление. Это означает, что вам нужно настроить уникальный ключ, чтобы попытаться сделать:

INSERT INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Sajjad','m','1/5/2010')  

... будет работать только один раз. Затем вы добавляете ON DUPLICATE KEY UPDATE предложение, чтобы изменить остальные поля (то есть те, которые не являются частью ключа), чтобы соответствовать.

Так, например, при условии, что я правильно прочитал структуру таблицы, если вы поместите уникальный составной ключ в столбцы std_id а также sib_name, это гарантирует, что вы не можете добавить двух братьев и сестер с одинаковым именем. А это значит, что когда вы идете, чтобы добавить еще один, как это:

INSERT INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Aamna','f','1/27/2005')  
ON DUPLICATE KEY 
  UPDATE sib_sex = 'f', sib_age = '1/27/2005'

... он сделает одну из двух вещей:

  1. добавьте новую строку, если Aamna не существует в семье #77.
  2. или обновите пол и дату рождения Амны, если она была добавлена ​​ранее.

Эта структура является более мощной, чем MySQL REPLACE потому что это позволяет вам сделать что-то иное с конфликтующей строкой, чем просто перезаписать его тем, что вы пытались вставить. Конечно, большую часть времени функциональность REPLACE это то, что на самом деле хотел. Но лучше узнать более общее утверждение.

Попробуйте следующее:

REPLACE INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Aamna','f','1/27/2005')

Проверить количество строк в футляре:

SELECT * where ...

if (number of rows == 0) {
   INSERT ...
} else {
   Update ...
}
Другие вопросы по тегам