ЗАМЕНИТЕ, ГДЕ ГДЕ два поля - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно заменить текст, когда моя комбинация неосновных полей (user1 и user2) существует в таблице.Или вставьте новую строку user1, user2, text - когда нет.

CREATE TABLE IF NOT EXISTS opinions 
(id INT AUTO_INCREMENT PRIMARY KEY, 
user1 INT, user2 INT, text TEXT);

+----+-----------+-----------+----------+
| id | user1     | user2     | text     |
+----+-----------+-----------+----------+
|  1 | 141015727 | 627964361 | nice guy |
|  2 | 141015727 | 375392538 | hello    |
+----+-----------+-----------+----------+ 

Ожидаемый результат:

+----+-----------+-----------+----------+
| id | user1     | user2     | text     |
+----+-----------+-----------+----------+
|  1 | 141015727 | 627964361 | bad guy  |
|  2 | 141015727 | 375392538 | hello    |
+----+-----------+-----------+----------+

UPD

mysql> выбрать * из мнений;

+----+-----------+-----------+--------+
| id | user1     | user2     | text   |
+----+-----------+-----------+--------+
|  1 | 141015727 | 627964361 | hello1 |
+----+-----------+-----------+--------+

Ожидаемый результат

+----+-----------+-----------+--------+
| id | user1     | user2     | text   |
+----+-----------+-----------+--------+
|  1 | 141015727 | 627964361 | hello2 |
+----+-----------+-----------+--------+

Попробовал (извините, похоже, я удалил этот ответ по ошибке)

IF EXISTS(SELECT user1, user2 FROM opinions WHERE user1=\'141015727\' 
AND user2 = \'627964361\') THEN UPDATE opinions SET text = \'hello2\' 
WHERE user1 = \'141015727\' AND user2 = \'627964361\' 
ELSE INSERT INTO opinions (user1, user2, text) 
VALUES (\'141015727\', \'627964361\', \'hello2\') END IF;' 

получил ошибку

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT user1, user2 FROM opinions WHERE user1='141015727' AND user2 = ' 

Ответы [ 4 ]

0 голосов
/ 13 октября 2018

Если бы я не был таким новичком, я бы просто сделал 2 запроса, так как мне не нужны уникальные идентификаторы, чтобы остаться прежними .Разобрался прямо сейчас.

CREATE TABLE IF NOT EXISTS opinions 
(id INT AUTO_INCREMENT PRIMARY KEY, 
user1 INT, user2 INT, text TEXT);

DELETE FROM opinions WHERE user1='1' AND user2='2';
INSERT INTO opinions (user1, user2, text) VALUES ('1','2','bad guy');  

это было так легко

0 голосов
/ 12 октября 2018

Вариант 1)

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

Вариант 2)

Сначала мы создадим уникальный индекс для вашей таблицы:

CREATE TABLE IF NOT EXISTS opinions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user1 INT,
    user2 INT,
    text TEXT,
    CONSTRAINT uniqueUsersTuple UNIQUE (user1, user2)
);

Затем вы можете сделать это:

INSERT INTO opinions (user1, user2, text)
VALUES (userID1, userID2, "newOpinion")
ON DUPLICATE KEY UPDATE text = "newOpinion";
0 голосов
/ 13 октября 2018

Или этот метод плохого парня, если вы не хотите создавать дополнительный уникальный ключ.Вы знаете, что каждый индекс немного замедляет выполнение запросов 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

0 голосов
/ 12 октября 2018

Ваше условие где не находится на первичном ключе.К сожалению, вы не можете сделать в 1 запрос.

См. Этот пост: MySQL UPSERT без ключа DUPLICATE

...