mySQLですべてのテーブルを一緒に使用するための適切なネイティブの非回避策の自動インクリメントの可能性はありますか?つまり、テーブルごとの自動インクだけでなく、データベース内の新しい行ごとに1つの数値がカウントアップされるということですか?
私はこれをプロのオラクル(?)のセットアップで見ました。主な利点は、テーブルごとだけでなく、すべてのテーブルのすべての行/要素に一意のIDがあることです。
mySQLですべてのテーブルを一緒に使用するための適切なネイティブの非回避策の自動インクリメントの可能性はありますか?つまり、テーブルごとの自動インクだけでなく、データベース内の新しい行ごとに1つの数値がカウントアップされるということですか?
私はこれをプロのオラクル(?)のセットアップで見ました。主な利点は、テーブルごとだけでなく、すべてのテーブルのすべての行/要素に一意のIDがあることです。
PostgreSQLは、このようにセットアップでき、すべての挿入CREATE SEQUENCE seq_name
で使用できます。nextval(seq_name)
MySQLはこれをネイティブでサポートしていません。1つの列とその列のみを含むテーブルを作成することで、PostgreSQLSEQUENCEの動作をシミュレートできAUTO_INCREMENT
ます。
常にそのテーブルに挿入し、最初にそのテーブルのを読み取って、LAST_INSERT_ID
テーブルに挿入する必要のあるIDを取得します。トランザクションセーフであるため、重複が生成されることはありません。
AUTO_INCREMENT
これを実現する別の方法は、現在の最大値を保持する1つの列番号と1つの行のみを持つテーブルを作成することです。
インクリメントする必要があるたびにUPDATE seq_table SET seq_column = seq_colum+1;
、インクリメント更新を実行すること自体がアトミックですが、後で値を読み取る必要があります。これにより、2つのステートメントが作成され、トランザクションと適切な分離レベルを設定しない限り、アトミックではありません。このアプローチはスペースを節約しますが、ロッククエリも生成します。
しようとしている複数のスレッドINSERT
は、他のスレッドが更新するのを待ってから、seq_table
自分で更新して新しい値を読み取ることができるようにする必要があります。
また、他のスレッドがインクリメントした後にインクリメントした値を読み取らないように、トランザクションでとを適切UPDATE
にSELECT
ラップする必要があります。seq_table
ISOLATION LEVEL
これはINSERTS
、トランザクションの問題になることを意味しますが、通常はそうではないため、2番目のアプローチはお勧めしません。