MySQL存储过程不存储

时间:2011-12-10 17:18:11

标签: mysql sql stored-procedures

我正在尝试编写一个存储过程来检查是否存在值,如果不存在,则会插入它。我遇到的问题是它不是str str。此过程的模式是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');

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

4 个答案:

答案 0 :(得分: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,以防止混淆字段名称和参数名称。

答案 1 :(得分:1)

首先,我会考虑在变量前加上一些字符串,以区别于列名 - 它会使您的查询更容易阅读。我使用下划线。

您的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)。

答案 2 :(得分:1)

关于你的sproc有点狡猾的事情。请尝试以下方法:

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;

希望这会有所帮助:)

答案 3 :(得分:0)

假设tag_id不为NULL,则始终为真:

WHERE tag_id = tag_id

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

WHERE tag_id = parameter_tag_id

或者在列前面加上表别名:

FROM tags WHERE tags.tag_id = tag_id