以编程方式设置AUTO_INCREMENT值

时间:2010-04-29 23:50:06

标签: mysql

所以这有效......

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键不会在旧网站和新网站之间发生冲突,并且需要自动执行此操作。所以我可以在新数据库上线时运行脚本)

4 个答案:

答案 0 :(得分:2)

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

ALTER TABLE table AUTO_INCREMENT = 1

答案 1 :(得分:1)

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

编辑:看起来你想要一份准备好的声明。搜索“动态SQL”几乎重复here

EDIT2:Tim,ref this链接,该链接在之前给出的几乎重复的StackOverflow帖子中引用。在页面上搜索字符串'Using Parameters',你就会得到它的瘦身。 MySql显然有点困难。在MSSqlServer 2000中,这是一个简单的过程。 Here是关于mysql dynamic sql

的文章的另一个链接

答案 2 :(得分:0)

我不知道这是不是一个好主意,但你可以用服务器端语言中的2个查询来做,例如,PHP吗?

$incrementStep = Db::query('SELECT MAX(id)+1 FROM old_db.varaition');

Db::query('ALTER TABLE variation AUTO_INCREMENT = ' . (int) $incrementStep);

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

答案 3 :(得分:0)

您可以像下面这样向动态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 ;