如何检查在mysql中存储多个值的变量中是否存在特定值?

时间:2014-07-16 19:29:48

标签: mysql triggers phpmyadmin

我正在尝试使用phpmyadmin触发器接口创建一个sql触发器语句。

尝试为表1做一些事情,如下所示:

BEGIN

declare @valid_number int ;

select id into @valid_number from table 2 ;

if 10 does not exist in @valid_number then
{do something here}
end if;
END

如何实现它?

1 个答案:

答案 0 :(得分:1)

首先:存储例程中的变量不能存储多个值,只能存储一个值。你的陈述

select id into @valid_number from table 2 ;
如果查询只返回一行,

将起作用。如果查询返回多行,则会发生错误,如果查询根本没有返回任何行,则会出现警告,请参阅手册页SELECT ... INTO

  

INTO子句可以命名一个或多个变量的列表,可以是   用户定义的变量,存储过程或函数参数,或   存储程序局部变量。 [...]

     

将所选值分配给变量。的数量   变量必须与列数匹配。查询应该返回一个   单排。如果查询未返回任何行,则会显示带有错误代码的警告   发生1329(无数据),变量值保持不变。 如果   查询返回多行,发生错误1172 (结果包含   不止一行)。

<强>解决方案:

创建一个能够在一行中给出所需答案的语句并不困难,即

SELECT COUNT(*) into valid_number FROM example WHERE id = 10;

如果列id中不存在id 10,则返回0,如果出现其他值,则返回0。当然,有几种方法可以实现这一点,这只是其中之一。您可以将存储的例程重写为:

BEGIN
    -- prefer local variables, don't use user defined, if not needed.
    DECLARE valid_number int;

    SELECT COUNT(*) into valid_number FROM example WHERE id = 10;

    IF valid_number = 0 THEN 
        -- do something here 
    END IF;

    SELECT result;
END

注意

您可以使用cursor遍历查询结果,但大多数情况下都希望避免使用游标。在这个问题的类似条件下使用游标不是SQL方法,而且大多数时候非常低效。