【问题标题】:MYSQL Stored procedure not behaving as expectedMYSQL 存储过程未按预期运行
【发布时间】:2021-08-25 11:39:15
【问题描述】:

我正在尝试创建一个存储过程,它将记录插入数据库并返回新创建的 id。如果已存在同名记录,则应返回该记录的 id。 这是我目前所拥有的,它适用于新插入的记录,但如果记录已经存在,则不返回任何内容。

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER 
BEGIN 
    INSERT INTO tag (name) VALUES (tag_name_in); 
    IF ROW_COUNT() = 1 THEN 
        SET tag_id_out = LAST_INSERT_ID(); 
    ELSE 
        SELECT id INTO tag_id_out FROM tag WHERE name=tag_name_in; 
    END IF; 
END

【问题讨论】:

  • tag (name) id 在表结构中是否定义为 UNIQUE?
  • 这是我目前所拥有的,它适用于新插入的记录,但如果记录已经存在,则不返回任何内容。 我认为您的 INSERT 只会生成唯一约束违规错误,并且过程失败。
  • @Akina yes tag(name) 是唯一的,我认为即使引发了约束违规错误,它也会继续执行。如果不是,那可能就是问题所在。

标签: mysql sql stored-procedures


【解决方案1】:

我完全看不出使用LAST_INSERT_ID() 的理由。

CREATE 
DEFINER=`root`@`localhost` 
PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) 
NOT DETERMINISTIC 
NO SQL 
SQL SECURITY DEFINER 
BEGIN 
    INSERT IGNORE INTO tag (name) VALUES (tag_name_in); 
    SELECT id INTO tag_id_out FROM tag WHERE name=tag_name_in; 
END

由于问题文本tag (name) 被定义为唯一(甚至可能是主键)。

【讨论】:

  • 将其标记为已接受的答案,因为 IGNORE 部分。建议的代码和我使用IGNORE 的原始代码都可以工作。谢谢。
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多