簡體   English   中英

更新 MySQL 數據庫中所有表的 AUTO_INCREMENT 值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM