【问题标题】:Mysql - procedure to get next auto incrementMysql - 获得下一个自动增量的过程
【发布时间】:2014-07-06 04:24:34
【问题描述】:

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

程序如下:

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;

我好像忘记了程序本身的某些内容,但我看不到?

【问题讨论】:

  • 你在列名周围使用",你真的得到了正确的结果吗?真不敢相信。
  • 为什么,为什么,为什么?哦,人类。
  • 抱歉,服务器启用了 ANSI_QUOTES。编辑了“无论如何,不​​会改变任何东西。

标签: mysql stored-procedures auto-increment


【解决方案1】:

要添加值 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');

【讨论】:

    【解决方案2】:

    我在下面尝试了自己,效果很好。

    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;
    

    【讨论】:

    • 感谢您的意见,但事实并非如此。我从 OP 中删除了引号,因为它们并不是真正需要的,但我可能应该提到服务器在启用 ANSI_QUOTES 的情况下运行。
    • @Feek.404,我想我明白了。再次查看编辑后的答案。
    • 那是我试图让代码摆脱外部表名的错误,对不起。您发布的第二个代码工作正常。 但是当我定义过程然后调用它时,结果会有所不同。也许我这样称呼它是错误的:CALL Find_last_AI('tabname', @out); 然后SELECT @out;
    • @Feek.404,不,你说得对。但是您是否正确传递了表名?我怀疑是这样。我无法通过创建 proc 来测试它;尝试在 SQL fiddle 中创建一个 proc,但这不起作用。
    • 这可能是问题所在,但到目前为止,在调用该过程时,我明确地将表名传递为'table_name'(如第一篇文章中所述)。我认为它应该像这样通过它?
    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 2017-07-31
    • 2010-11-25
    • 2011-10-09
    • 2016-01-08
    • 2012-06-22
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多