Способ сохранить и обновить только одну строку с TYPE = 3

0

Стол:

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 в программе? Предпочтительно делать это в одной команде и без триггеров?

  • 0
    Я не думаю, что есть способ автоматизировать это. Даже триггер не будет работать, потому что триггеры не могут изменять одну и ту же таблицу.
  • 0
    В любом случае вам нужно будет SELECT чтобы узнать, есть ли в таблице несколько типов 3, даже если это была «одиночная» команда. Что вы используете сейчас?
Показать ещё 1 комментарий
Теги:

2 ответа

0

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

Предположим, вы хотите обновить 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.

0

Одним из способов может быть добавление нового кортежа, сохранение идентификатора пользователя, добавленного в переменную, тогда

 delete where type = 3 and id != {Added id}

это сработает, но я хочу сделать выражение об отказе от ответственности, что оно кажется изворотливым каким-то образом

Ещё вопросы

Сообщество Overcoder
Наверх
Меню