(MYSQL) Auto_increment 基于另一个表的最大 id 的临时表?

Posted

技术标签:

【中文标题】(MYSQL) Auto_increment 基于另一个表的最大 id 的临时表?【英文标题】:(MYSQL) Auto_increment a temporary table based off the max id of another table? 【发布时间】:2020-11-03 13:48:09 【问题描述】:

我这里有一个带有一堆列和一个 rowID 字段的表的 mysql 代码。 rowID 字段是主键和唯一索引。在存储过程中,我创建了一个临时表来进行一些数据操作,并且我希望临时表以第一个表中的 MAX(rowID)+1 开头。我现在有这个代码:

set @auto_incID = (SELECT (MAX(rowID)+1) from `mytable`); 

set @sql = concat('CREATE TEMPORARY TABLE `myTempTable` auto_increment = ',@auto_incID, ' SELECT * FROM mytable where items = 20;');
PREPARE st FROM @sql;
EXECUTE st;
DEALLOCATE PREPARE st;

问题是,此代码返回错误代码 1062:键 'PRIMARY' 的重复条目 '1'。经过进一步检查,似乎 auto_increment 实际上并没有更新临时表,它只是按原样接收来自第一个表的条目(即它们的 rowID 保持不变,不是从 MAX(rowID)+1 开始。我我弄错了?还是这不可能?

【问题讨论】:

SELECT * 复制所有列值而不做任何更改。您的 auto_increment 将仅在创建 trable 后应用。 @Akina 谢谢你提供的信息,我想了很多。有没有可行的方法来执行我打算做的事情? 很容易。只需打破键盘上的星号键,除COUNT(*) 外永远不要使用它。然后列出 INSERT 和 SELECT 部分中的所有列,并将 NULL 文字放入 SELECT for id coluimn。 @Akina 能否提供一个小例子来说明“在 SELECT 中为 id 列放置一个 NULL 文字”是什么意思? 【参考方案1】:

一个例子:

-- Create source table
CREATE TABLE old (old_id INT AUTO_INCREMENT PRIMARY KEY, old_value INT);
-- Fill it with some data
INSERT INTO old (old_value) VALUES (11), (22);
-- Create new table copying the data and reassigning the primary key values
CREATE TABLE new (new_id INT AUTO_INCREMENT PRIMARY KEY, new_value INT) AUTO_INCREMENT=1000 
    SELECT null AS new_id, old_value AS new_value FROM old;

在fiddle上查看结果

【讨论】:

啊,我明白你的意思了!谢谢,非常感谢您的帮助! @PrinceofCats 请注意,最后一个查询的 SELECT 部分中的输出列与新表的列名别名。这是强制性的! 对,我想我不能使用旧表中的相同名称。谢谢! @PrinceofCats 否。 CREATE 部分中的列名和 SELECT 部分中的列别名必须严格匹配 - 如果列列表中不存在别名,则将在结构中再添加一列,如果向后然后将分配 NULL/DEFAULT(如果列不可为空且没有默认值,则会引发错误)。 好吧,我想通了。我的意思是我不认为我可以在我的 CREATE 语句中将与旧表中的列名匹配的列名分配给新表,即使用您之前的示例,我不能这样做:CREATE TABLE new (old_id INT AUTO_INCREMENT PRIMARY KEY...) where the column新表中的名称与旧表中的名称匹配。对吗?

以上是关于(MYSQL) Auto_increment 基于另一个表的最大 id 的临时表?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:创建表查询中的'AUTO_INCREMENT = 5'是啥?

MySQL 序列使用:使用 AUTO_INCREMENT获取AUTO_INCREMENT值

mysql中auto_increment(整数)的限制是多少

MySQL auto_increment问题

MySQL中auto_increment的基本特性

如何在 MySQL 中重置 AUTO_INCREMENT