[英]Updating AUTO_INCREMENT value of all tables in a MySQL database
可以通過以下方式設置/重置 MySQL 表的AUTO_INCREMENT
值
ALTER TABLE some_table AUTO_INCREMENT = 1000
但是我需要在其現有值上設置AUTO_INCREMENT
(以修復 MM 復制),例如:
ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1
這不起作用
實際上,我想對數據庫中的所有表運行此查詢。 但實際上這並不是很關鍵。
除了手動運行查詢之外,我找不到解決此問題的方法。 請你提出一些建議或指出我的一些想法。
謝謝
使用:
ALTER TABLE some_table AUTO_INCREMENT = 0
...將根據 auto_increment 列中的最高現有值將 auto_increment 值重置為下一個值。
要在所有表上運行此操作,您需要使用MySQL 的名為 PreparedStatements 的動態 SQL 語法,因為您無法將表名作為變量提供給 ALTER TABLE 語句。 您必須遍歷以下輸出:
SELECT t.table_name
FROM INFORMATION_SCHEMA.TABLES t
WHERE t.table_schema = 'your_database_name'
...為每個表運行上面的 ALTER TABLE 語句。
set @db = 'your_db_name';
SELECT concat('ALTER TABLE ', @db, '.', TABLE_NAME, ' AUTO_INCREMENT = 0;')
FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db AND TABLE_TYPE = 'BASE TABLE'
然后復制粘貼並運行你得到的輸出。
在下面的說明中,您需要用正確的值替換 [括號] 中的所有內容。 嘗試前備份。
如果您可以通過命令行以 root 身份登錄 mysql,那么您可以執行以下操作來重置所有表上的 auto_increment,首先我們將構建我們想要運行的查詢:
進行數據庫備份:
mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]
登錄:
mysql -u root -p
將 group_concat_max_length 設置為更高的值,這樣我們的查詢列表就不會被截斷:
SET group_concat_max_len=100000;
使用以下命令創建我們的查詢列表:
SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]";
然后你會收到一長串 mysql 查詢,后面跟着一堆破折號。 將查詢字符串復制到剪貼板,它看起來類似於:
ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...
更改為要在其上運行命令的數據庫:
USE [DATABASENAME];
然后粘貼剪貼板上的字符串並按回車鍵運行它。 這應該在數據庫中的每個表上運行更改。
弄亂? 從您的備份中恢復,請確保在運行以下命令之前注銷 mysql(只需鍵入exit;
即可)
gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]
對於您使用這些命令中的任何一個而造成的任何損害,我將不承擔任何責任,使用風險自負。
假設您必須通過修改自動增量列而不是分解 N:M 關系的表中的外鍵來解決此問題,並且您可以預測正確的值是什么,請嘗試使用相關列不在的臨時表自動遞增,然后將其映射回原始表,然后將列類型更改為自動遞增,或者截斷原始表並從臨時表加載數據。
我在 github 上找到了這個要點,它對我來說就像一個魅力: https : //gist.github.com/abhinavlal/4571478
命令:
mysql -Nsr -e "SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t WHERE t.table_schema = 'DB_NAME'" | xargs -I {} mysql DB_NAME -e "ALTER TABLE {} AUTO_INCREMENT = 1;"
如果您的數據庫需要密碼,不幸的是,您必須將其放入命令中才能使其工作。 一種解決方法(仍然不是很好但有效)是將密碼放在安全文件中。 您可以隨時刪除該文件,以便密碼不會保留在您的命令歷史記錄中:
... | xargs -I {} mysql -u root -p`cat /path/to/pw.txt` DB_NAME -e...
我寫了下面的程序更改數據庫名稱並執行該程序
CREATE DEFINER=`root`@`localhost` PROCEDURE `setAutoIncrement`()
BEGIN
DECLARE done int default false;
DECLARE table_name CHAR(255);
DECLARE cur1 cursor for SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t
WHERE t.table_schema = "buzzer_verifone";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
open cur1;
myloop: loop
fetch cur1 into table_name;
if done then
leave myloop;
end if;
set @sql = CONCAT('ALTER TABLE ',table_name, ' AUTO_INCREMENT = 1');
prepare stmt from @sql;
execute stmt;
drop prepare stmt;
end loop;
close cur1;
END
使用下面的行執行上面的過程
Call setAutoIncrement();
重置 mysql 表自動增量非常簡單,我們可以通過單個查詢來完成,請參閱http://webobserve.blogspot.com/2011/02/reset-mysql-table-autoincrement.html 。
MySQL 數據庫中更新/重置 AUTO_INCREMENT 的最快解決方案
確保AUTO_INCREMENT
列未被用作另一個表上的FOREIGN_KEY
。
首先,將AUTO_INCREMENT
COLUMN 刪除為:
ALTER TABLE table_name DROP column_name
示例: ALTER TABLE payments DROP payment_id
然后重新添加該列,並將其作為表中的第一列移動
ALTER TABLE table_name ADD column_name DATATYPE AUTO_INCREMENT PRIMARY KEY FIRST
示例: ALTER TABLE payments ADD payment_id INT AUTO_INCREMENT PRIMARY KEY FIRST
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.