我正在尝试编写一个存储过程来检查是否存在值,如果不存在,则会插入它。我遇到的问题是它不是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');
然而桌子仍然是空的。我做错了吗?
答案 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