У меня есть таблица с поля 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
. Это зависит от использования первичного ключа или уникального ключа.