Mysql - 获得下一次自动增量的过程

时间:2014-05-17 22:59:28

标签: mysql stored-procedures auto-increment

我在编写存储过程以获取自动增量列的下一个值时遇到一些问题。我希望能够传递一个表名并将值返回给指定的变量。

程序如下:

CREATE PROCEDURE Find_last_AI(
        IN table_name VARCHAR(255),
        OUT last_AI INT)
BEGIN
    SELECT AUTO_INCREMENT
    INTO last_AI
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'MySchema'
    AND   TABLE_NAME = table_name
    LIMIT 1;
END;

问题是,在我调用这样的函数之后:

CALL Find_last_AI('MyTable', @out);    
SELECT @out;

无论表输入是什么,我得到相同的错误结果 - 数值(5)。问题是,当我将代码作为查询执行时,结果会产生正确的值。

SELECT AUTO_INCREMENT
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'MySchema'
    AND   TABLE_NAME   = 'table_name'
    LIMIT 1;

似乎我忘记了程序本身的某些东西,但我看不到它?

2 个答案:

答案 0 :(得分:1)

我在下面试过自己,但效果很好。

set @tabname = 'tab';

    SELECT AUTO_INCREMENT
    INTO @incre
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @tabname
    LIMIT 1;

select @incre;

另外值得一提的是,使用上面的查询,您将获得下一个(未来)auto_increment值(除了现值+ 1)。

修改

终于搞定了;问题出在您的查询中LIMIT 1。尝试下面的代码,它保证工作正常(测试)。另外,不要将任何保留字用作变量名。

DELIMITER $$
CREATE PROCEDURE Find_last_AI(IN tname VARCHAR(255), OUT last_AI INT)
BEGIN
    SELECT AUTO_INCREMENT
    INTO last_AI
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'test'
    AND   TABLE_NAME = tname;
END$$
DELIMITER ;

运行类似

的程序
CALL Find_last_AI('test3', @last_AI);    
SELECT @last_AI;

答案 1 :(得分:0)

添加值auto_increment你必须在程序中执行它,获取最后一个id并添加1,这是一个有点有效的解决方案我离开SP:

#SP 
DELIMITER $$
CREATE OR REPLACE PROCEDURE set_Estados(in Estado VARCHAR(45))
    BEGIN
        DECLARE validar INT;
        DECLARE ID INT;
        SELECT COUNT(*) INTO validar FROM table_name WHERE table_row=Estado;
        if validar = 0 THEN
            SELECT (max(estados_id)+1) INTO ID FROM table_name limit 1;
            #the value estados_id its a auto_increment value, just call to add the value...
            INSERT INTO table_name(estados_id,estados_estado) VALUES(ID,Estado);
            CALL get_Estados(); #SP that show all data...
        ELSE
            SELECT CONCAT('El Estado: ',Estado,' ya existe.') ESTADO;
        END IF;
    END$$
DELIMITER ;

CALL set_Estados('Activo');