MySQL - 如果用户不存在则创建用户

9
CREATE USER IF NOT EXISTS ...

一个新用户可以轻松创建。但是一个已存在的用户返回错误,但文档中写道 CREATE USER 适用于 MySQL > 5.7.6

MySQL 版本为

Ver 14.14 Distrib 5.7.11, for osx10.9 (x86_64) using  EditLine wrapper

示例

<root:none> CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar';
--------------
CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar'
--------------

Query OK, 0 rows affected (0.00 sec)

<root:none> CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar';
--------------
CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar'
--------------

ERROR 1396 (HY000): Operation CREATE USER failed for 'foo'@'localhost'

有什么建议吗?

这里“创建用户”失败了,因为该用户已经存在。 - Nagendra Nigade
我期望 IF NOT EXISTS 能够像其他地方一样处理这个错误。这是一个已知的 bug 还是我使用不正确? - Vishal
1
严格的SQL模式是否已启用? - Shadow
我不确定是否已经处理过,但是有一些方法可以处理这个问题。例如,您可以使用 select * from user where user='name'; 或者从此查询中获取计数。或者,由于您正在创建用户,因此必须授予用户权限。在mysql中,如果尚未创建用户,则可以使用授权命令创建用户,例如 GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 授权将创建用户(如果尚未存在)。 - Nagendra Nigade
我很感激还有其他方法可以达到相同的结果。我很想了解为什么“IF NOT EXISTS”不像文档中所述那样工作。 - Vishal
可能是mysql create user if not exists的重复问题。 - jww
2个回答

21

CREATE USER IF NOT EXISTS语句在使用IDENTIFIED BY子句且用户已存在时会抛出错误,如果不使用IDENTIFIED BY子句,则不会抛出错误并如预期工作。

mysql> CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar';
ERROR 1396 (HY000): Operation CREATE USER failed for 'foo'@'localhost'

mysql> CREATE USER IF NOT EXISTS 'foo'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

从5.7.8版本开始,不再使用CREATE USER IF NOT EXISTS,在调用带有IDENTIFIED BY子句的CREATE USER之前,可以使用DROP USER IF EXISTS

mysql> DROP USER 'foo'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> DROP USER 'foo'@'localhost';
ERROR 1396 (HY000): Operation DROP USER failed for 'foo'@'localhost'

mysql> DROP USER IF EXISTS 'foo'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

另一种选择是先创建用户,然后在创建后设置密码。

mysql> CREATE USER IF NOT EXISTS 'foo'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER IF NOT EXISTS 'foo'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SET PASSWORD FOR 'foo'@'localhost' = 'bar';
Query OK, 0 rows affected (0.01 sec)

2
DROP USER IF EXISTS 后跟 CREATE USER IDENTIFIED BY ...CREATE USER IF NOT EXISTS IDENTIFIED BY ... 非常不同,具有一些严重的不良后果。前者比后者更加危险。我不清楚 CREATE USER IF NOT EXISTSIDENTIFIED BY 的意图是否故意未实现。感谢您的评论。尽管如此,我仍然感谢您提供的替代建议。 - Vishal
3
您可以使用 CREATE USER IF NOT EXISTS 命令创建用户时不需要添加 IDENTIFIED 语句。之后,您可以使用 SET PASSWORD FOR 命令来设置密码。 - Zubair Suri
答案被接受是因为它有助于解决问题。目前不清楚这种行为是故意的还是有缺陷的。 - Vishal
我以为 SQL 应该是标准的。为什么没有一种适用于所有情况的标准方法呢?(在测试中,4 个 MySQL/MariaDB 系统中有 3 个执行方式不同) - jww

-2
尝试执行 FLUSH PRIVILEGES。
FLUSH PRIVILEGES;
GRANT ALL ON *.* TO 'foo'@'localhost';

你可以查看这个链接,它可能会对你有所帮助。

link


这是否意味着 CREATE USER IF NOT EXISTS 存在缺陷并且已知晓? - Vishal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接