MySql INSERT INTO 变量忽略 WHERE 条件

MySql INSERT INTO variables ignore WHERE condition

我有一个 table 'users' 并且在这个 table 中我有 1 行用户名 'test'。 一旦我尝试填充这些变量,他就会忽略 where 条件并获取第一个条目。我做错了什么?

SELECT `username`, `password`, `active`, `login_attempts`, `mail`
INTO @username, @password, @active, @login_attempts, @mail
FROM `security`.`users`
WHERE `username` = 'ts';
SELECT @username;

结果:@用户名:测试

在这种情况下,它不应该 return 任何值,对吗?

SELECT username, password, active, login_attempts, mail INTO @username, @password, @active, @login_attempts, @mail FROM security.users WHERE username = 'ts'; SELECT @username;

尝试 运行在 mysql 中为通常存储在 /usr/bin/mysql 中的终端执行此操作 运行 /usr/bin/mysql -u usernameOfYourComputer -p 如果它很可能会起作用,那么它只是 mysql-workbench

中的一个错误

如果 MySQL 没有找到任何行,它 不会 null 覆盖变量,但它会保留旧值!因此,您的最终 select 将向您显示它在您执行 select ... into 之前包含的用户名,因此可能是您之前查询现有用户名的 运行(在同一会话中)的结果.

同样,如果您 运行 您的查询没有 into,并且没有找到一行,您将得到 0 行,而不是带有 null 的行(这可能是分配给您的变量)。

为了验证,运行 select @username; 在您的 select ... into 之前,它将包含旧用户名。

您需要在 运行 查询之前(重新)初始化这些值,例如做

SELECT null, null, null, null, null
INTO @username, @password, @active, @login_attempts, @mail;

SELECT username, password, active, login_attempts, mail
INTO @username, @password, @active, @login_attempts, @mail
FROM security.users
WHERE username = 'ts';

SELECT @username;

如果您开始一个新会话,该变量还不存在,这就是 对您有用的原因,因为它是您 运行 在新会话中的第一个查询。如果您点击 MySQL workbench 中的重新连接按钮,您可以获得类似的效果。