MYSQL:存储过程,插入一行,然后通过 LAST_INSERT_ID() 选择它

Posted

技术标签:

【中文标题】MYSQL:存储过程,插入一行,然后通过 LAST_INSERT_ID() 选择它【英文标题】:MYSQL: stored procedure, insert a row and then select it via LAST_INSERT_ID() 【发布时间】:2012-05-20 18:59:19 【问题描述】:

我正在尝试调用 AddCluster 的存储过程 女巫正在接受参数'title'和'alt'

案例 1:

如果“标题”在数据库中,则返回“旧”行!

案例 2:

如果“标题”不在数据库中,那么,

根据 parmerer 'title' 和 'alt' 插入一行

然后通过 LAST_INSERT_ID() 选择新添加的行

问题在于案例 2,它只返回空!!

-- --------------------------------------------------------------------------------
-- AddCluster Group Routines
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`linkbay_dk`@`%` PROCEDURE `AddCluster`(in in_title varchar(45), in in_alt text)
BEGIN
    /* check if 'in_title' is in db */
    IF EXISTS
    (
        SELECT count(*) FROM Cluster 
        WHERE title=in_title 
    )
    THEN
        /* returns old Cluster there is in db */
        SELECT * FROM Cluster WHERE title=in_title; 
    ELSE
        INSERT INTO Cluster
        (
            `id`,
            `create_at`,
            `title`,
            `alt`
        )
        VALUES
        (
            null,
            NOW(),
            in_title,
            in_alt
        );
        /* returns the newly added Cluster */
        SELECT * FROM Cluster WHERE id=LAST_INSERT_ID();
    END IF;
END$$

【问题讨论】:

【参考方案1】:

尝试在不指定 id 的情况下插入:

...
ELSE
    INSERT INTO Cluster
    (
        `create_at`,
        `title`,
        `alt`
    )
    VALUES
    (
        NOW(),
        in_title,
        in_alt
    );
    /* returns the newly added Cluster */
    ...

确保Cluster.idAUTO_INCREMENT 列,只有这样您才能获得LAST_INSERT_ID() 的值。

【讨论】:

在不指定 id 的情况下尝试一下... AUTO_INCREMENT 已开启,但没有运气:( 如果从命令行运行 INSERT 和 SELECT 查询,它是否按预期工作? 我正在使用 mysql Workbench,但是从 SQL 编辑器中是的,我可以对“集群”表进行 INSERT 和 SELECT 查询...而且我可以调用 AddCluster() 并在案例 1 中返回一行,但不是案例 2..【参考方案2】:

只是一点点更新。 我找到了错误..这是count(*)

SELECT count(*) FROM Cluster WHERE title=in_title 

应该是这样的:

SELECT * FROM Cluster WHERE title=in_title

见孔更新存储过程here!

【讨论】:

以上是关于MYSQL:存储过程,插入一行,然后通过 LAST_INSERT_ID() 选择它的主要内容,如果未能解决你的问题,请参考以下文章

存储过程的 LAST_INSERT_ID() 结果

Mysql 存储过程返回 LAST_INSERT_ID 为零

Mysql 在存储过程中使用 LAST_INSERT_ID

mysql 游标(循环读取一行数据插入到另一张表)

mysql 游标(循环读取一行数据插入到另一张表)

MySQL 从存储过程中检索 last_insert_id