Стол:
ID TYPE USER_ID
======================
1 1 15
2 1 15
. 3 15
. 1 15
.
должен содержать несколько USER_ID с TYPE = 1, но only
0 или 1 строку, где TYPE = 3. В случае, когда TYPE = 3, после вставки мне нужно либо обновить, либо создать (так же, как insert on duplicate key update
) этой строки. Есть ли хороший способ сделать это без первого SELECT
и обновления или вставки в зависимости от результатов SELECT в программе? Предпочтительно делать это в одной команде и без триггеров?
Вы можете выполнить обновление с помощью подзапросов. В этом случае, поскольку вы хотите читать и писать в один и тот же кортеж, вам нужно будет переименовать подзапрос в той же таблице, чтобы удалить блокировку этого кортежа.
Предположим, вы хотите обновить user_id первой строки данных с типом = 3 до 20:
UPDATE tbl SET user_id=20 WHERE id=
(SELECT A.id FROM (SELECT MIN(id) id
FROM tbl
WHERE type=3) A);
См. DEMO ON SQL Fiddle.
Одним из способов может быть добавление нового кортежа, сохранение идентификатора пользователя, добавленного в переменную, тогда
delete where type = 3 and id != {Added id}
это сработает, но я хочу сделать выражение об отказе от ответственности, что оно кажется изворотливым каким-то образом
SELECT
чтобы узнать, есть ли в таблице несколько типов 3, даже если это была «одиночная» команда. Что вы используете сейчас?