如何使用IF THEN ELSE来选择和插入或更新查询?

时间:2018-02-16 11:52:02

标签: mysql sql mariadb

我一直在尝试使用以下查询

IF EXISTS (SELECT id FROM users WHERE id = 1) 
THEN 
    (INSERT INTO users (id, username) VALUES (2, user2)) 
ELSE 
    (UPDATE users SET username = 'userUpdated')

但我一直在

/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO users (id) VALUES (2)) ELSE (UPDATE users SET id = 11)' at line 1 */

还尝试使用以下查询

IF EXISTS (SELECT id FROM users WHERE id = 1) 
THEN 
    (SELECT username FROM users WHERE id = 1) 
ELSE 
    (INSERT INTO users (id, username) VALUES (1, 'user'))

但是这次我得到了

/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ELSE 
(INSERT INTO users (id, username) VALUES (1, 'user'))' at line 4 */

我在做什么或者理解错了什么?

4 个答案:

答案 0 :(得分:2)

if 语句只能用于编程块,例如存储过程,函数和触发器。

无论如何,MySQL为此功能提供了更简单的语法:insert . . . on duplicate key update

要使用它,id必须具有唯一索引,唯一约束或定义为主键。我假设已经如此定义的列已经如此定义。

然后:

INSERT INTO users (id, username)
    VALUES (2, user2)
    ON DUPLICATE KEY UPDATE username = 'userUpdated';

答案 1 :(得分:0)

你错过了END IF(和半冒号)吗?

IF EXISTS (SELECT id FROM users WHERE id = 1) 
    THEN 
    (SELECT username FROM users WHERE id = 1);
ELSE 
    (INSERT INTO users (id, username) VALUES (1, 'user'));
END IF;

答案 2 :(得分:0)

试试这个。

IF EXISTS (SELECT id FROM users WHERE id = 1) 
begin

    INSERT INTO users (id, username) VALUES (2, 'user2')
    end
ELSE 
    UPDATE users SET username = 'userUpdated'

答案 3 :(得分:0)

在MariaDB 10.1及更高版本中,您可以在存储过程之外使用复合语句。 This blog post可以很好地描述您可以用它做什么。

以下是博客的一个例子:

BEGIN NOT ATOMIC
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN  
   ROLLBACK;
   RESIGNAL;
  END;

  START TRANSACTION;

    stmt1;
    ....
    stmtN;

  COMMIT;
END