【问题标题】:Set AUTO_INCREMENT value programmatically以编程方式设置 AUTO_INCREMENT 值
【发布时间】:2011-02-14 01:13:01
【问题描述】:

所以这行得通...

ALTER TABLE variation AUTO_INCREMENT = 10;

但我想这样做;

ALTER TABLE variation AUTO_INCREMENT = (SELECT MAX(id)+1 FROM old_db.varaition);

但这不起作用,也不行;

SELECT MAX(id)+1 INTO @old_auto_inc FROM old_db.variation 
ALTER TABLE variation AUTO_INCREMENT = @old_auto_inc;

那么有人知道怎么做吗?

(我试图确保 AUTO_INCREMENT 键不会在旧站点和新站点之间发生冲突,并且需要自动执行此操作。所以我可以在新数据库上线时运行脚本)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我不知道这是否是个好主意,但您可以使用服务器端语言(例如 PHP)的 2 个查询来做到这一点吗?

    $incrementStep = Db::query('SELECT MAX(id)+1 FROM old_db.varaition');
    
    Db::query('ALTER TABLE variation AUTO_INCREMENT = ' . (int) $incrementStep);
    

    假设Db::query 是一个神奇的查询方法,每次都能准确返回你想要的:)

    【讨论】:

    • 是的,我希望在 SQL 中完成这一切,但看起来我需要做类似上面的事情。
    【解决方案2】:

    我对mysql不够熟悉,无法给出具体答案。但是,在其他数据库引擎中,有一个 EXEC 方法,您可以将字符串传递给该方法将被执行。您只需编写一个脚本来确定您想要的 auto_increment 值,然后将该值作为字符串插入到 EXEC 脚本中。基本上是编写一个脚本来编写第二个脚本并运行它。

    编辑:看起来你想要一个准备好的语句。搜索 'Dynamic SQL' 有一个几乎重复的 here

    EDIT2: Tim, ref this 链接,在之前给出的几乎重复的 StackOverflow 帖子中提到。在页面上搜索字符串“Using Parameters”,你会得到它的瘦身。 MySql 显然使这有点困难。在 MSSqlServer 2000 中,这是一个微不足道的过程。 Here 是另一个链接到一篇关于mysql动态sql的文章

    【讨论】:

    • 好主意,但似乎 mysql 不喜欢它 mysql> PREPARE stmt FROM 'ALTER TABLE variant AUTO_INCREMENT = ?'; ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行
    【解决方案3】:

    将你的auto_increment设置为1,零不起作用,mysql会自动将最大值设置为索引值的下一个值。

    ALTER TABLE table AUTO_INCREMENT = 1
    

    【讨论】:

      【解决方案4】:

      您可以将静态值动态注入到动态 SQL 调用中,如下所示:

      SET @minEmptyId := 1337;
      CALL statement(CONCAT('
        ALTER TABLE tableName
        AUTO_INCREMENT = ', @minEmptyId))
      ;
      

      statement程序实现:

      DELIMITER $$
      CREATE PROCEDURE statement(IN dynamic_statement TEXT)
      BEGIN
            SET @dynamic_statement := dynamic_statement;
            PREPARE prepared_statement FROM @dynamic_statement;
            EXECUTE prepared_statement;
            DEALLOCATE PREPARE prepared_statement;
        END$$
      DELIMITER ;
      

      【讨论】:

        猜你喜欢
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多