3

現在の内容に従って、mysql テーブルの自動インクリメントを最小値に自動的にリセットするエレガントな方法があるかどうか疑問に思いました。

例:

マイテーブル:

1  content of row 1
2  content of row 2
3  content of row 3
4  content of row 4
5  content of row 5

自動インクリメントは 6 になります

ただし、新しいコンテンツを挿入する前に、行 3、4、および 5 を削除します。コンテンツは次のようになります。

1  content of row 1
2  content of row 2

自動インクリメントは 6 のままです。

これが問題です。

挿入されたIDによると、これは可能な限り低い値であるため、自動インクリメントを3にしたいと思います。

これにより、自動インクリメントが「無限に」大きくなり、12 桁の整数の範囲を超えた場合、極端に大きな数値を防ぐことができます。

提案をありがとう!

4

2 に答える 2

12

これはストレージエンジンによって異なりますが、

MyISAMおよびMySQL5.6以降のInnoDBのAUTO_INCREMENT場合、テーブルの値をに設定できます1。その値は自動的に最大電流値+1に増加します。このようにします。

ALTER TABLE table_name AUTO_INCREMENT = 1;

MySQL <5.6上のInnoDBの場合、これは機能しないため、次のように手動で行う必要があります。

SELECT MAX(autoincrement_field) + 1 FROM table_name INTO @maxautoinc;
ALTER TABLE table_name AUTO_INCREMENT = @maxautoinc;

最後のケースでは、2つのクエリを同じデータベース接続で実行する必要があることに注意してください。

于 2012-12-12T19:06:43.713 に答える
1

自動インクリメント ID をリセットします。

http://community.spiceworks.com/scripts/show/3042-reset-auto-increment-ids

データベース内のすべての自動インクリメント列を、データベース内の現在の値に基づいて可能な最小値に更新します。これは、データベースをクリーンアップした後に行う必要がありました。

ストアド プロシージャ内でプリペアド ステートメントを使用します。

drop PROCEDURE if exists reset_autoincrement;
DELIMITER //
CREATE PROCEDURE reset_autoincrement (IN schemaName varchar(255))
 BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE o_name VARCHAR(255);
    DECLARE o_table VARCHAR(255);
    DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.`COLUMNS` WHERE extra LIKE '%auto_increment%' and table_schema=schemaName;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur1;
    read_loop: LOOP
     FETCH cur1 INTO o_name, o_table;

     IF done THEN
       LEAVE read_loop;
     END IF;

  set @qry1 = concat('SELECT MAX(`',o_name,'`) + 1 as autoincrement FROM `',o_table,'` INTO @ai'); 
  PREPARE stmt1 FROM @qry1;
  EXECUTE stmt1;

  IF @ai IS NOT NULL THEN
      SELECT  o_name, o_table;
   select @qry1;
   select @ai;
   set @qry2 = concat('ALTER TABLE `',o_table,'` AUTO_INCREMENT = ', @ai);
   select @qry2;
   PREPARE stmt2 FROM @qry2;
   EXECUTE stmt2;
  END IF;

    END LOOP;

    CLOSE cur1;
 END //
DELIMITER ;


call reset_autoincrement('my_schema_name');
于 2015-02-19T20:48:13.687 に答える