为啥我不能准备这个 sql 语句来设置 auto_increment?

Posted

技术标签:

【中文标题】为啥我不能准备这个 sql 语句来设置 auto_increment?【英文标题】:Why can't I prepare this sql statement to set auto_increment?为什么我不能准备这个 sql 语句来设置 auto_increment? 【发布时间】:2015-05-16 01:59:21 【问题描述】:

我想通过首先找到最大 id 值来设置每列的 auto_increment 值。

我引用this SO question的代码。

准备好的语句的mysql docs 显示类似的格式,所以我很困惑。

当我尝试运行准备语句时,我遇到了失败。为什么?

以下是我尝试准备常规语句以及尝试使用“?”准备 auto_increment 语句时的输出以后装订。

mysql> PREPARE stmt1 FROM 'ALTER TABLE user AUTO_INCREMENT=2';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> PREPARE stmt1 FROM 'ALTER TABLE user AUTO_INCREMENT=?';
ERROR 1064 (42000): 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 1

【问题讨论】:

How to Reset an MySQL AutoIncrement using a MAX value from another table?的可能重复 您链接到的问题包含许多关于此问题的 cmet,并且至少一个答案具有可行的解决方法。如果您的问题是“为什么”而不是“如何”,那么鉴于文档未涵盖此用例,它可能与基于意见的主题无关。 我想知道why,是因为mysql版本还是操作系统等原因。我需要确保我的代码可以在多个服务器上运行。 如果您担心可移植性,请采取务实的方法,不要为此任务使用准备好的语句。我不明白你为什么要在这里使用用户输入,而且无论如何要确保你在连接中使用的值是一个整数并不难。 【参考方案1】:

另一种选择是

set @alter_statement = concat('alter table user auto_increment = ', @value);
prepare stmt1 from @alter_statement;
execute stmt1;
deallocate prepare stmt1;

由于某些原因,似乎很多人在使用 prepare? 时遇到语法错误。

我的猜测是它失败了,因为给定的值将被替换为两个单引号之间的值(但这只是一个猜测)。

【讨论】:

以上是关于为啥我不能准备这个 sql 语句来设置 auto_increment?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?

java中sql语句为啥不能出现 * ?

数据库如何设置主键(ID)自动增长啊(SQL语句)?

HSQLDB - 为啥我不能将默认值设置为 -1

为啥我不能在 python 中获取 sql 语句?

为啥“WHERE”查询不能在 php 中使用 SQLITE [重复]