mysql程序检查条目是不是存在

Posted

技术标签:

【中文标题】mysql程序检查条目是不是存在【英文标题】:mysql procedure check if entry existsmysql程序检查条目是否存在 【发布时间】:2015-01-26 04:07:26 【问题描述】:

我需要一个程序来告诉我是否存在条目,以便我知道我是否有权限。

    CREATE DEFINER=`root`@`localhost` procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean)
begin
    set @q = concat("select idtblUsers into @rs from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid);

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

    if @rs is not null then
        select true into b;
    else
        select false into b;
    end if;

END$$

call checkPermission('tblProjects', 2, 1, @b)

如果没有条目(我没有获得许可),它总是在 mysql-workbench 中返回 1,即使它说没有数据(警告 1329)。但我想在@b 中返回 true 或 false。

【问题讨论】:

【参考方案1】:

请试一试这个缩短版。 主要问题是DEFINER=root@localhost。这将使用 root@localhost 拥有的权限执行该过程。由于他很可能拥有所有权利,因此他不会遇到权限限制。因此,要么删除它并使用受限用户创建过程,要么将其更改为 DEFINER=restricted_user@hostexists() 也是更好的选择,因为它会在找到条目后立即停止。

CREATE procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean)
begin
    set @q = concat("select exists(select 'whatever' into b from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid, ')');

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

END$$

【讨论】:

【参考方案2】:

它几乎完成了这项工作,但这对我有用

CREATE procedure `checkPermission`(tbl varchar(50), id int, userid int, out b boolean) 
begin
    set @q = concat("select exists( select idtblUsers from ", tbl, " where id", tbl, '=', id, ' && idtblUsers=', userid, ') into @b ');

    prepare stmt1 FROM @q;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;

    select @b into b;
END$$

【讨论】:

以上是关于mysql程序检查条目是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

续集如何检查数据库中是不是存在条目

已经存在数据查询并绕过php mysql中的新条目

在mysql中的重复条目上跳过插入

当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?

如何知道数据库中的条目是不是唯一

Wordpress 更新 mysql 表