首页 文章

如何创建插入过程以返回插入的行

提问于
浏览
2

这是我目前的SQL:

CREATE PROCEDURE addBlog(@title VARCHAR(255), @body VARCHAR(255), OUT @uuid INT) BEGIN
    INSERT INTO blogs b (b.title, b.detail) VALUES (@title, @body);
    SELECT LAST_INSERT_ID() INTO @uuid;
    SELECT @uuid;
END

哪个抛出此错误(直接来自SQL导出):

1064 - 您的SQL语法有错误;检查与MariaDB服务器版本对应的手册,以便在'@title VARCHAR(255),@ body VARCHAR(255),OUT @uuid INT附近使用正确的语法 . 在第1行开始插入博客'

我的数据库 AUTO_INCREMENT PRIMARY KEYuuid INT (255) 上,我想使用此过程返回 . 任何帮助都会很棒 .

我的表看起来像这样:

CREATE TABLE `blogs` (
  `uuid` int(255) NOT NULL,
  `title` varchar(1024) NOT NULL,
  `detail` varchar(1024) NOT NULL,
  `user_id` int(255) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `blogs`
  ADD PRIMARY KEY (`uuid`),
  ADD KEY `user_id` (`user_id`);

ALTER TABLE `blogs`
  MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

ALTER TABLE `blogs`
  ADD CONSTRAINT `blogs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` 
(`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;

更新的SQL:

CREATE PROCEDURE addBlog(
    IN in_title VARCHAR(255),
    IN in_body VARCHAR(255), 
    IN in_user INT(255),
    OUT out_uuid INT
) BEGIN
    INSERT INTO `blogs` (`title`, `detail`, `user_id`) VALUES (in_title, in_body, in_user);
    SELECT LAST_INSERT_ID() INTO out_uuid;
    SELECT out_uuid;
END;

2 回答

  • 1

    您缺少参数类型定义,例如 INOUT 等 . 此外,我认为您不需要在参数定义中使用 @ .

    此外,我想确保存储过程/触发器等中的变量/参数的名称与它们中使用的任何表/列名称不同 .

    此外,如果您还没有这样做,则需要将分隔符重新定义为除 ; 之外的其他内容(例如, $$ );并在最后将其重新定义为 ; .

    DELIMITER $$ -- define the delimiter
    
    CREATE PROCEDURE addBlog(IN title_in VARCHAR(255), -- added suffix "in" to param name
                             IN body_in VARCHAR(255), 
                             OUT uuid_out INT) BEGIN
    ...... 
    
    END $$ -- end of stored procedure
    DELIMITER ; -- redefine delimiter back to ;
    
  • 1

    你的语法是来自多个数据库的奇怪的混搭 . 我想你想要:

    CREATE PROCEDURE addBlog (
        in_title VARCHAR(255),
        in_body VARCHAR(255),
        OUT out_uuid INT
    )
    BEGIN
        INSERT INTO blogs (title, detail)
            VALUES (in_title, in_body);
        SELECT LAST_INSERT_ID() INTO out_uuid;
        -- SELECT out_uuid;
    END;
    

    Here是一个db <>小提琴 .

相关问题