2016-11-14 9 views
-1

私は自分の行の一部を削除した後も、常にテーブルのAUTO_INCREMENT値を "リセット"する必要があります。実際の例を使って説明しましょう:MySQLはAUTO_INCREMENTの値をMAX(id)+ 1ショートカットに設定しますか?

私はCLIENTというテーブルを持っています。いくつかの行を削除する前にauto_incrementが11に設定されているとします。次に、4つの最後の行を削除します。 auto_incrementはまだ11に設定されています。したがって、いくつかのクライアントを再び挿入すると、idの穴ができます。

私は常にauto_incrementを "クリーン"にする必要があります。以下、この機能を使用して:

function cleanAutoIncrement($tableName, $columnAutoIncrement, $pdo) 
{ 
    $r = false; 

    try { 
     $p = $pdo->prepare("SELECT IFNULL(MAX($columnAutoIncrement) + 1, 1) AS 'max' FROM $tableName LIMIT 1;"); 
     $p->execute(); 

     $max = $p->fetch(PDO::FETCH_ASSOC)['max']; 

     $p = $pdo->prepare("ALTER TABLE $tableName AUTO_INCREMENT = $max;"): 

     $p->execute(); 

     $r = true; 
    } 
    catch(Exception $e) { 
     $r = false; 
    } 

    return $r; 
} 

関数は、テーブル内の最大のIDを取得することで、その後1のそれをインクリメントし、(テーブルに行がなかった場合、それは1を返す)、その値を返す何。次に、IDの穴を開けないように、テーブルを変更して「クリーン」IDをリセットします。手動でこれを行うことなく、このタスクを実行するには、任意のMySQLのコマンドは

QUESTION

ありますか?

+2

何度も尋ねられていますが、シーケンスの隙間は問題にならない – e4c5

+1

テーブル内の自動インクリメント列のカウンタをリセットする唯一の方法は、**テーブルを切り捨てることですあなたが望むものではない)。第二に、私は完全に@ e4c5に同意します。ギャップがなくても常にIDを稼働させることが重要なのはなぜですか? – FDavidov

+0

IDの間にギャップがない理由は何ですか? @ e4c5で述べたように、_autoインクリメントIDにはギャップがないことは避けられません。このようなフィールドが必要な場合は、別の整数フィールドを作成して手動で計算/生成することをお勧めします(これを避けることを強くお勧めします)。 – EhsanT

答えて

0

この質問を閉じるには、MySQLにショートカットが存在しないため、このタスクの実行はお勧めしません。

関連する問題