5

MySQL で、次のような MyISAM テーブルがあるとします。

CREATE TABLE `table1` (
`col1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`col2` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`col2`, `col1`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

行を挿入すると、自動インクリメントベースは、個別の col2 値ごとに一意になります。私の説明が十分に明確でない場合、この回答はよりよく説明する必要があります。ただし、InnoDB はこの動作に従いません。実際、InnoDB では、主キー定義の最初に col2 を配置することさえできません。

私の質問は、MAX(id)+1 などのメソッドに頼らずに、InnoDB でこの動作をモデル化することは可能ですか? 私が見つけることができる最も近いのはthisですが、これは PostgreSQL 用です。

編集:タイトルのスペルミス

4

1 に答える 1

1

これは、私が以前に使用した MyISAM の優れた機能ですが、InnoDB では実行できません。InnoDB は起動時に最大数を決定し、その数を RAM に保持し、必要に応じて増分します。

InnoDB は同時挿入/更新を処理するため、トランザクションの開始時に番号を予約する必要があります。トランザクションのロールバックでは、番号は引き続き「使用」されますが、保存されません。このため、MAX(id) ソリューションで問題が発生する可能性があります。トランザクションが開始され、番号が予約され、別のトランザクションで最大の「保存された」番号 + 1 を取得します。これは、最初のトランザクションで予約されたものと同じです。トランザクションが終了し、予約番号が保存され、あなたの番号と競合します。

MAX(id) は、使用された最大の数値ではなく、保存された最大の数値を返します。必要な数値を生成することだけを目的とした MyISAM テーブルを作成できます。MAX(id) ソリューションと同じ数のクエリです。1 つは SELECT で、もう 1 つは INSERT です。

于 2013-06-15T20:22:40.730 に答える