【问题标题】:How to set AUTO_INCREMENT from another table如何从另一个表设置 AUTO_INCREMENT
【发布时间】:2015-12-09 14:17:07
【问题描述】:

如何在另一个表中设置AUTO_INCREMENT 上的CREATE TABLEALTER TABLE

我发现了这个问题,但没有解决我的问题: How to Reset an MySQL AutoIncrement using a MAX value from another table?

我也试过这个:

CREATE TABLE IF NOT EXISTS `table_name` (
  `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `columnOne` tinyint(1) NOT NULL,
  `columnTwo` int(12) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=(SELECT `AUTO_INCREMENT` FROM  `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = 'database_name' AND `TABLE_NAME` = 'another_table_name');

这个:

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

这个:

CREATE TABLE IF NOT EXISTS `table_name` (
  `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `columnOne` tinyint(1) NOT NULL,
  `columnTwo` int(12) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=(SELECT (MAX(`id`)+1) FROM `another_table_name`);

还有这个:

ALTER TABLE `table_name` AUTO_INCREMENT=(SELECT (MAX(`id`)+1) FROM `another_table_name`);

【问题讨论】:

标签: mysql auto-increment create-table alter-table


【解决方案1】:
SELECT `AUTO_INCREMENT` INTO @AutoInc
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME = 'old_table';

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

【讨论】:

  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
【解决方案2】:

这很好用:

DELIMITER $$
CREATE PROCEDURE `tbl_wth_ai`(IN `ai_to_start` INT)
BEGIN

SET @s=CONCAT('CREATE TABLE IF NOT EXISTS `table_name` (
  `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `columnOne` tinyint(1) NOT NULL,
  `columnTwo` int(12) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = ', `ai_to_start`);

  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;

CALL tbl_wth_ai((SELECT MAX(`id`)+1 FROM `another_table_name`));
DROP PROCEDURE IF EXISTS tbl_wth_ai;

【讨论】:

    【解决方案3】:

    此代码将为您创建程序:

    CREATE PROCEDURE `tbl_wth_ai`(IN `ai_to_start` INT)
    BEGIN
    
    SET @s=CONCAT('CREATE TABLE IF NOT EXISTS `table_name` (
      `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
      `columnOne` tinyint(1) NOT NULL,
      `columnTwo` int(12) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = ', `ai_to_start`);
    
      PREPARE stmt FROM @s;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END;
    

    然后你可以调用CALL tbl_wth_ai(2); 传递括号内的参数。

    例如:

    CALL tbl_wth_ai((SELECT id FROM `ttest` WHERE c1='b'));
    

    【讨论】:

    • 谢谢,但我收到此错误消息:ERROR 1064 (42000) at line 1: 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 '' at line 4
    • @Codename - 我猜你没有改变分隔符。这就是你没有考虑你链接的答案的原因吗?
    • @ÁlvaroG.Vicario:你指的是哪个分隔符,'...'?我也试过"..."
    • @Codename 您似乎在一个查询中调用了两个查询(过程创建及其调用)。阅读this answer at stackowerflow。简单来说。您可以使用DELIMITER $$ 开始您的代码,然后用$$ 分隔两个查询,并在整个双重查询语句的末尾设置DELIMITER ;。我的答案中给出的代码不包含任何语法错误。它工作正常,成功运行后从我的 MySQL IDE 复制粘贴。
    • @asd-tm:非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2012-04-24
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多