Или этот метод плохого парня, если вы не хотите создавать дополнительный уникальный ключ.Вы знаете, что каждый индекс немного замедляет выполнение запросов UPDATE и DELETE, поэтому, если вы выполняете много записей в таблицы, это может в некоторой степени превзойти ответ D.Smania.
Когда запись существует
Запрос
REPLACE INTO
opinions (
id
, user1
, user2
, opinion
)
SELECT
id
, user1
, user2
, opinion
FROM (
SELECT
id
, user1
, user2
, 'bad guy' AS opinion
, (@found := 1) AS found
FROM
opinions
WHERE
user1 = 141015727
AND
user2 = 627964361
UNION ALL
SELECT
DISTINCT
null AS id
, 141015727 AS user1
, 627964361 AS user2
, 'bad guy' AS opinion
, (@found := 0) AS found
FROM
opinions
WHERE
@found <> 1
) AS alias
CROSS JOIN (SELECT @found := 0) AS init_var_params
Результат
| id | user1 | user2 | opinion |
| --- | --------- | --------- | ------- |
| 1 | 141015727 | 627964361 | bad guy |
| 2 | 141015727 | 375392538 | hello |
Просмотр на БД Fiddle
Когда запись не существует
Запрос
REPLACE INTO
opinions (
id
, user1
, user2
, opinion
)
SELECT
id
, user1
, user2
, opinion
FROM (
SELECT
id
, user1
, user2
, 'bad guy' AS opinion
, (@found := 1) AS found
FROM
opinions
WHERE
user1 = 100
AND
user2 = 100
UNION ALL
SELECT
DISTINCT
null AS id
, 100 AS user1
, 100 AS user2
, 'bad guy' AS opinion
, (@found := 0) AS found
FROM
opinions
WHERE
@found <> 1
) AS alias
CROSS JOIN (SELECT @found := 0) AS init_var_params
Результат
| id | user1 | user2 | opinion |
| --- | --------- | --------- | -------- |
| 1 | 141015727 | 627964361 | nice guy |
| 2 | 141015727 | 375392538 | hello |
| 3 | 100 | 100 | bad guy |
Вид на БД Fiddle
Отредактировано
IИспользование пользовательских переменных MySQL с некоторыми изменениями также возможно без пользовательских переменных MySQL.Поэтому другие системы баз данных с REPLACE или другим методом UPSET также могут использовать этот метод.
Существующий Без пользовательских переменных MySQL. Просмотр БД Fiddle
Несуществующий Без пользовательских переменных MySQL. Просмотр БД Fiddle