sql >> データベース >  >> RDS >> Mysql

MySQL:IDを自動インクリメントするときに、INSERTステートメントが56個の数値をスキップするのはなぜですか?

    この動作は、「バルクインサート」 および innodb_autoinc_lock_mode 設定。

    私が理解している限り(これについてはドキュメントが明確ではありません)、INSERT INTO ... SELECTを使用すると ステートメント、MySQLはクエリを実行する前に実際に挿入されている行数を知ることはできませんが、innodb_autoinc_lock_mode=1を使用する場合は、新しいAUTO_INCREMENT値のIDを予約する必要があります。 (連続)または2 (インターリーブ)。私の観察から、カウントが2の累乗であるAUTO_INCREMENT番号のセットを予約します(これを確認することはできず、推測のみです)。次の例を参照してください:

    CREATE TABLE sourceTable(
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20)
    );
    
    CREATE TABLE targetTable(
        id INT AUTO_INCREMENT PRIMARY KEY,
        original VARCHAR(30)
    );
    
    INSERT INTO sourceTable(name) VALUES ('one');
    INSERT INTO sourceTable(name) VALUES ('two');
    INSERT INTO sourceTable(name) VALUES ('three');
    INSERT INTO sourceTable(name) VALUES ('four');
    INSERT INTO sourceTable(name) VALUES ('five');
    
    INSERT INTO targetTable(original) SELECT name FROM sourceTable;
    
    INSERT INTO targetTable(original) VALUES ('manual');
    
    SELECT * FROM targetTable;
    

    これにより、次の出力が生成されます。

    +----+----------+
    | id | original |
    +----+----------+
    |  1 | one      |
    |  2 | two      |
    |  3 | three    |
    |  4 | four     |
    |  5 | five     |
    |  8 | manual   |
    +----+----------+
    

    ソーステーブルから5行を挿入すると、次の8つの可能なAUTO_INCREMENT値が予約されます。これは、5より大きい2の数値の最も近い累乗であるためです。ただし、5行しか挿入しないため、5行のみが使用されます。

    >

    あなたの場合、200行を挿入しているので、200より大きい2の最も近い累乗は256になります。したがって、56の欠落しているAUTO_INCREMENT値の「ギャップ」があり、次のエントリはID256を取得します。




    1. nullでない場合は列の値を選択し、そうでない場合は別の列の値を使用します

    2. 自動インクリメント主キーを使用したレコードの挿入

    3. 承認付きのデータベース編集-mysql

    4. MySQLの削除された「root」ユーザーとパスワードを復元する