根据 select 结果更改 AUTO_INCREMENT 值
Alter AUTO_INCREMENT value by select result
基本上我想要的是以下代码的工作版本:
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 uses the in-memory auto-increment counter as long as the server
runs. When the server is stopped and restarted, InnoDB reinitializes
the counter for each table for the first INSERT to the table, as
described earlier.
这意味着每当我重新启动服务器时,我的 auto_increment 值都设置为可能的最小值。
我有一个 table 叫 ticket
和另一个叫 ticket_backup
。他们都有一个共享的列 id
。 ticket
table 内的记录可用,客户可以领取。当他们声明 ticket
时,我将记录插入 ticket_backup
,然后从 ticket
table 中删除它们。截至今天,我已经领取了 56 thousand
张门票(在 ticket_backup
内)并且有 0 张门票可用。如果我现在重新启动服务器并且不执行 ALTER TABLE
,我提供的第一张票将具有 id 1
,这是一个已被 ticket_backup
使用的 ID,从而导致我出现重复密钥错误如果我不修复自动增量值。我希望在单个查询中执行此操作的原因是能够在服务器启动时轻松执行查询。
那
呢
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) )
如果您想要相同的初始增量值
快速浏览一下,错误说明了一切。语法不正确
语法应遵循:
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'
);
试试这个:
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;
基本上我想要的是以下代码的工作版本:
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 uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier.
这意味着每当我重新启动服务器时,我的 auto_increment 值都设置为可能的最小值。
我有一个 table 叫 ticket
和另一个叫 ticket_backup
。他们都有一个共享的列 id
。 ticket
table 内的记录可用,客户可以领取。当他们声明 ticket
时,我将记录插入 ticket_backup
,然后从 ticket
table 中删除它们。截至今天,我已经领取了 56 thousand
张门票(在 ticket_backup
内)并且有 0 张门票可用。如果我现在重新启动服务器并且不执行 ALTER TABLE
,我提供的第一张票将具有 id 1
,这是一个已被 ticket_backup
使用的 ID,从而导致我出现重复密钥错误如果我不修复自动增量值。我希望在单个查询中执行此操作的原因是能够在服务器启动时轻松执行查询。
那
呢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) )
如果您想要相同的初始增量值
快速浏览一下,错误说明了一切。语法不正确
语法应遵循:
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'
);
试试这个:
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;