Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用子查询mysql更改同一表中的自动增量_Mysql_Auto Increment - Fatal编程技术网

使用子查询mysql更改同一表中的自动增量

使用子查询mysql更改同一表中的自动增量,mysql,auto-increment,Mysql,Auto Increment,我正在使用mysql。我有一个设置了自动递增计数器的数据库表。现在由于一个要求,我需要保留起始100个id,并从101开始移动所有现有记录,因此当前id 1将变为101,id 2将变为102,依此类推 我可以将记录移动到101,但问题是如何将自动递增计数器更改为maxid+1 我这里的主要限制是,我需要在一条sql语句中完成这项工作。我无法使用@counter保存该值并在以后使用 我试着使用下面的查询 ALTER TABLE role AUTO_INCREMENT = (SELECT rd.co

我正在使用mysql。我有一个设置了自动递增计数器的数据库表。现在由于一个要求,我需要保留起始100个id,并从101开始移动所有现有记录,因此当前id 1将变为101,id 2将变为102,依此类推

我可以将记录移动到101,但问题是如何将自动递增计数器更改为maxid+1

我这里的主要限制是,我需要在一条sql语句中完成这项工作。我无法使用@counter保存该值并在以后使用

我试着使用下面的查询

ALTER TABLE role AUTO_INCREMENT = (SELECT rd.counter FROM (SELECT (MAX(id) + 1) AS counter FROM role r) rd);

但是它不起作用。

解析器不支持您试图使用它的地方的子查询

以下是MySQL源代码的摘录,来自sql/sql_yacc.yy:

create_table_option:
    . . .
    | AUTO_INC opt_equal ulonglong_num
您应该了解的是,AUTO_INCREMENT table选项只接受单个文字数字,而不接受表达式、子查询、变量或其他任何内容。因此,不能在选择MAXid+1的同一语句中设置AUTO_INCREMENT

但你不必这么做

MySQL永远不会分配小于表中当前最大值的自动增量id。因此,如果您有一个id值为102的表,那么下一个分配的值至少是103


您甚至可以尝试显式设置AUTO_INCREMENT=50,但它会自动增加到MAXid+1。

您在问题中说过

我这里的主要限制是,我需要在一条sql语句中完成这项工作。我无法使用@counter保存该值并在以后使用

实际上,您可以尝试使用动态SQL,看看它是否可以按如下方式工作:

SELECT (MAX(id) + 1) INTO @counter FROM role;
SET @sql = CONCAT('ALTER TABLE role AUTO_INCREMENT=',@counter);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
这可能有效,也可能无效。即使它确实适用于您,也表明它不是必需的,因为MySQL已经处理了自动增量值。无需手动执行MySQL已经执行的操作

还请注意


解析器在您尝试使用子查询的位置不支持该子查询

我写了一封信

因此,您应该接受,因为最好什么也不做。

根据maual,当您手动插入或更改自动增量字段中的值时,自动增量值将自动调整


因此,在为记录提供新id=id+100后,您不必再关心自动增量值…

对于@Peter的响应,您似乎必须在更改现有的自动增量值后更新自动增量值。以下示例是在MariaDB 10.0.12上完成的:

MariaDB [test]> show create table m;
+-------+--------------------------------------------------------+
| Table | Create Table                                           |
+-------+--------------------------------------------------------+
| m     | CREATE TABLE `m` (                                     |
|       |`id` int(10) unsigned NOT NULL AUTO_INCREMENT,          |
|       |`t` varchar(10) NOT NULL DEFAULT '',                    |  
|       |PRIMARY KEY (`id`)                                      |
|       |) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> insert into m (t) values ('a'),('b');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from m;
+----+---+
| id | t |
+----+---+
|  1 | a |
|  2 | b |
+----+---+
2 rows in set (0.00 sec)

MariaDB [test]> update m set id=id+10;
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [test]> select * from m;
+----+---+
| id | t |
+----+---+
| 11 | a |
| 12 | b |
+----+---+
2 rows in set (0.00 sec)

MariaDB [test]> show create table m;
+-------+--------------------------------------------------------+
| Table | Create Table                                           |
+-------+--------------------------------------------------------+
| m     | CREATE TABLE `m` (                                     |
|       |`id` int(10) unsigned NOT NULL AUTO_INCREMENT,          |
|       |`t` varchar(10) NOT NULL DEFAULT '',                    |  
|       |PRIMARY KEY (`id`)                                      |
|       |) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> insert into m (t) values ('c');
Query OK, 1 row affected (0.04 sec)

MariaDB [test]> select * from m;
+----+---+
| id | t |
+----+---+
|  3 | c |
| 11 | a |
| 12 | b |
+----+---+
3 rows in set (0.00 sec)

MariaDB [test]>

它不起作用并不能有效地解释你所面临的问题。确切的错误消息是什么?您检查过文档了吗?它不工作意味着它抛出以下错误。错误1064 42000:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解第1行“SELECT rd.counter FROM SELECT MAXid+1 AS counter FROM role r rd”附近使用的正确语法,是的,我查看了ALTER TABLE命令的文档,但没有针对此特定场景提及任何内容。似乎是你需要做的事情。看起来你想使用一个外部应用程序来执行你想要的准确答案。然而,你可能不得不这样做。自动增量字段是安全的,可以加上年份等前缀,然后可以获得自动增量id,如2014xxx1 2014xxx2等。。。并要求每年更新一次。@snowflake,我希望您每年在此表中插入的内容不会超过100000次:-当然使用未签名的大整数,我可以达到18446744073709551615,这意味着XYYYYY999999999999,其中X作为1844年之前年份的不可用前导值,YYYY作为年份!即使有几个月和几天,这也是我喜欢的把戏!这可能是我处理类似问题的方式;我们的主机做了一些古怪的事情,将数据写入了错误的dbs;我们必须做一个回滚;因此,我首先拯救了关键数据,它们在8个相互关联的表中的ID现在会与自损坏发生以来发生的ID冲突。但是,用新ID将它们重新缝合的过程不知何故导致自动增量比记录本身更快地推进n+1记录。。。但是我不容易知道用一个一个的方式来更正它们的字面意思是什么。@RolandoMySQLDBA您好,先生,您的回答很完美,但我想对我的整个特定数据库表做同样的事情,您能帮我吗,但在某些情况下,我认为使用某些innodb锁方法加上执行多行插入的存储过程等,从外观上看,自动增量值n+1的增长速度比添加的n个记录的增长速度更快,从而导致需要修复的分歧。。。但是只能用文字来表达。。。使事情复杂化了。