Хранимая процедура MySQL не хранится - PullRequest
0 голосов
/ 10 декабря 2011

Я пытаюсь написать хранимую процедуру, которая проверяет, существует ли значение, и если нет, оно вставит его.Проблема, которую я имею, состоит в том, что это не волнуется.Схема для этой процедуры: 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 ]

1 голос
/ 10 декабря 2011

Пару вещей, которые немного неутешительны в вашем спроке.Попробуйте следующее:

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 голос
/ 10 декабря 2011

Попробуйте это

  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 голос
/ 10 декабря 2011

Во-первых, я бы рассмотрел добавление к вашим переменным какой-либо строки, чтобы отличать их от имен столбцов - это облегчит чтение вашего запроса.Я использую подчеркивания.

Ваша проверка 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).

0 голосов
/ 10 декабря 2011

Если tag_id не равно NULL, это всегда будет верно:

WHERE tag_id = tag_id

Одним из решений является присвоение параметру имени, отличного от столбца:

WHERE tag_id = parameter_tag_id

Или префикс столбца с псевдонимом таблицы:

FROM tags WHERE tags.tag_id = tag_id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...