【问题标题】:Alter AUTO_INCREMENT value by select result通过选择结果更改 AUTO_INCREMENT 值
【发布时间】:2015-03-03 08:04:01
【问题描述】:

基本上我想要的是以下代码的工作版本:

ALTER TABLE table_name
AUTO_INCREMENT =
(
    SELECT
        `AUTO_INCREMENT`
    FROM
        INFORMATION_SCHEMA.TABLES
    WHERE
        TABLE_SCHEMA = 'database_name'
    AND TABLE_NAME = 'another_table_name'
);

错误:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AUTO_INCREMENT =

原因:

根据MySQL Doc

InnoDB 使用内存中的自动增量计数器,只要服务器 运行。当服务器停止并重新启动时,InnoDB 重新初始化 每个表的第一个 INSERT 表的计数器,如 前面已经介绍过了。

这意味着每当我重新启动服务器时,我的 auto_increment 值都会设置为可能的最小值。

我有一张名为ticket 的桌子和另一张名为ticket_backup 的桌子。他们都有一个共享的列idticket 表中的记录是可用的,并且可以由客户声明。当他们声明ticket 时,我将记录插入ticket_backup,然后从ticket 表中删除它们。截至今天,我已经认领了56 thousand 门票(在ticket_backup 内)和0 张门票可用。如果我现在重新启动服务器并且不执行ALTER TABLE,那么我提供的第一张票将有id 1,这是ticket_backup 已经使用的ID,因此如果我不修复会导致我重复密钥错误自增值。我希望在单个查询中这样做的原因是能够在服务器启动时轻松执行查询。

【问题讨论】:

  • 世上没有你想要这样做的理由。
  • 查询中没有SET。 MySQL 语法错误消息包含以检测到语法错误开始的查询片段。它说:“SET AUTO_INCREMENT =”
  • @Strawberry 我将编辑主要问题以提供我的理由。
  • @axiac 我已经解决了这个问题,下面的答案之一就是关于这个问题,但这并没有解决问题。
  • 分别运行两个查询并使用客户端代码将使用SELECT检索到的值放入ALTER TABLE中不是更容易吗?

标签: mysql sql select auto-increment alter-table


【解决方案1】:

怎么样

ALTER TABLE table_name 
SET AUTO_INCREMENT = (SELECT MAX(a.AUTO_INC_VAL) FROM database_name.table_name a) )

如果你想要当前的增量值或者

ALTER TABLE table_name 
SET AUTO_INCREMENT = (SELECT MIN(a.AUTO_INC_VAL) FROM database_name.table_name a) )

如果你想要相同的初始增量值

【讨论】:

  • 这些选项都不起作用。他们都给了我和我的陈述一样的错误。
【解决方案2】:

快速浏览一下,错误就说明了一切。语法不正确

语法应遵守:

ALTER TABLE table_name AUTO_INCREMENT=<INTEGER_VALUE>;

所以查看您的查询,删除单词“SET”

ALTER TABLE table_name AUTO_INCREMENT =
(
    SELECT
        `AUTO_INCREMENT`
    FROM
        INFORMATION_SCHEMA.TABLES
    WHERE
        TABLE_SCHEMA = 'database_name'
    AND TABLE_NAME = 'another_table_name'
);

【讨论】:

  • 虽然这确实有道理,并指出我对使用 ALTER TABLE 的正确方法缺乏关注,但您的解决方案不起作用。我想由于某种原因,我无法在 DDL 语句中执行 DML 语句。我的代码只是对我希望实现的目标的解释。
  • 是的,看看stackoverflow.com/questions/2741485/…,看起来您必须通过应用程序代码而不是 SQL 来完成。有趣 :) 那么,也许有一个 postinst 脚本可以做到这一点?
【解决方案3】:

试试这个:

SELECT `AUTO_INCREMENT` INTO @AutoInc
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'another_table_name';

SET @s:=CONCAT('ALTER TABLE `database_name`.`table_name` AUTO_INCREMENT=', @AutoInc);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

  • 你明天会收到赏金代表。谢谢。
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多