MySQL – обновление, если существует else, вставить двумя ключами

У меня есть таблица с поля foreign_key_id | value1 | value2, и я хочу обновить value2, если у меня есть соответствие foreign_key_id и value1.

Если foreign_key_id или value1 не существует, я хочу вставить новую строку. Есть ли лучший способ сделать это, чем PHP использовать оператор select, а затем разветвляться либо на обновление, либо на вставку?

Изменить: значение2 может быть того же значения, что и в базе данных, поэтому я не могу запускать и обновлять, видеть, имеет ли значение action_rows значение 0, и запускать и вставлять, если это так.

Попробуйте использовать IF EXISTS чтобы определить, следует ли выполнять UPDATE или INSERT . Вы можете сделать это в одном выражении / запросе PHP.

 IF EXISTS(SELECT 1 FROM Mytable WHERE foreign_key_id = f1 AND value1 = v1) BEGIN UPDATE Mytable SET value2 = v2 WHERE foreign_key_id = f1 AND value1 = v1; END ELSE BEGIN INSERT INTO Mytable(foreign_key_id,value1,value2) VALUES (f1,v1,v2); END IF; 

Да, вы можете просто запустить обновление, а затем получить количество затронутых строк . Если это 0, запустите вставку. Это позволит вам выбрать, потому что он включен в обновление.

[редактировать]

Запрос, опубликованный в комментариях. Вставьте с помощью выбора. Это позволит сохранить предварительный выбор. Вы можете использовать mysql_affected_rows, чтобы получить количество вставленных строк. Если он возвращает 0, вы можете обновить его. На самом деле он содержит выбор, поэтому я не уверен, что это fasters (mysql и subselects не совсем друзья). Тем не менее, это спасет вас от перекрестка к базе данных, и это может просто компенсировать это.

 insert into yourtable(f1, f2, fr) select 'value1', 'value2', 'value3' from dual /* yeah, I'm an Oracle dude */ where not exists ( select 'x' from yourtable where f1 = 'value1' and f2 = 'value2') 

Попробуйте эту небольшую модификацию, если вы не можете получить решение p.campbell для работы

 IF EXISTS(SELECT 1 FROM Mytable WHERE foreign_key_id = f1 AND value1 = v1) THEN UPDATE Mytable SET value2 = v2 WHERE foreign_key_id = f1 AND value1 = v1; ELSE INSERT INTO Mytable(foreign_key_id,value1,value2) VALUES (f1,v1,v2); END IF; 

Лучший вариант: используйте REPLACE вместо INSERT или UPDATE . Это зависит от использования первичного ключа или уникального ключа.