【问题标题】:MySQL Stored Procedure Not StoringMySQL存储过程不存储
【发布时间】:2011-12-10 17:18:10
【问题描述】:

我正在尝试编写一个存储过程来检查一个值是否存在,如果不存在,它将插入它。我遇到的问题是它不是stroing。此过程的架构是 tag_id VARCHAR(24) 主键和标记 varchar(255)

创建过程

DELIMITER //

CREATE PROCEDURE `create_tag_not_exist` (IN tag_id VARCHAR(24), IN tag VARCHAR(255))
BEGIN
IF(SELECT COUNT(*) FROM tags WHERE tag_id = tag_id <= 0 ) THEN
INSERT INTO tags(tag_id, tag) VALUES (tag_id, tag);
END IF;
END //

插入数据

call create_tag_not_exist('abc123', 'doeraeme');

但桌子仍然是空的。我做错了吗?

【问题讨论】:

  • 在 WHERE 子句中,Tag_id 似乎是数字,但在 INSERT 和示例调用中它是 VARCHAR(24)。什么数据类型是正确的?
  • were 子句将其读取为数字?我正在尝试查找是否存在任何带有 tag_id 的结果,所以我认为将 count 和

标签: mysql sql stored-procedures


【解决方案1】:

试试这个

  DELIMITER //

    CREATE PROCEDURE `create_tag_not_exist` (IN tagID VARCHAR(24), 
                                             IN tag VARCHAR(255))
    BEGIN
    IF( (SELECT COUNT(*) FROM tags WHERE tag_id = TagID)<1) THEN
    INSERT INTO tags(tagID, tag) VALUES (tag_id, tag);
    END IF;
    END //

我将参数名称从 Tag_id 更改为 TagID 以防止字段名称和参数名称混淆。

【讨论】:

    【解决方案2】:

    关于你的存储过程的一些事情有点狡猾。请尝试以下操作:

    drop table if exists tags;
    create table tags
    (
    tag_id smallint unsigned not null primary key,
    name varchar(255) unique not null
    )
    engine=innodb;
    
    drop procedure if exists insert_tag;
    
    delimiter #
    
    create procedure insert_tag
    (
    in p_tag_id smallint unsigned,
    in p_name varchar(255)
    )
    proc_main:begin
    
        if exists (select 1 from tags where tag_id = p_tag_id) then 
           leave proc_main;
        end if;
    
        insert into tags (tag_id, name) values (p_tag_id, p_name);
    
    end proc_main #
    
    delimiter ;
    
    call insert_tag(1,'tag one');
    call insert_tag(2,'tag two');
    call insert_tag(1,'tag one');
    call insert_tag(3,'tag three');
    
    select * from tags;
    

    希望这会有所帮助:)

    【讨论】:

    • +1 获取完整答案,包括示例,包括将参数重新定义为更好的类型并演示 EXISTS 关键字。
    【解决方案3】:

    首先,我会考虑在您的变量前面加上一些字符串,以将它们与列名区分开来——这将使您的查询更易于阅读。我使用下划线。

    您的 IF 检查错误 - 您的括号放错了位置。

     IF (SELECT COUNT(*) FROM tags where tag_id = _tagid) = 0 THEN
          THEN
             INSERT INTO tags(tag_id, tag) VALUES (_tagid, _tag);
          END IF;
    

    我还建议将您的参数作为与您查询的列相同的类型传递。否则,您将依赖类型转换(如果存在)。所以 tag_id 真的应该作为一个 int 传入(假设它是一个 int)。

    【讨论】:

      【解决方案4】:

      假设tag_id 不为NULL,这将永远为真:

      WHERE tag_id = tag_id
      

      一种解决方案是为参数指定与列不同的名称:

      WHERE tag_id = parameter_tag_id
      

      或者在列前加上它的表别名:

      FROM tags WHERE tags.tag_id = tag_id 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-01
        • 2017-04-26
        • 2011-03-09
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多