5

mySQLですべてのテーブルを一緒に使用するための適切なネイティブの非回避策の自動インクリメントの可能性はありますか?つまり、テーブルごとの自動インクだけでなく、データベース内の新しい行ごとに1つの数値がカウントアップされるということですか?

私はこれをプロのオラクル(?)のセットアップで見ました。主な利点は、テーブルごとだけでなく、すべてのテーブルのすべての行/要素に一意のIDがあることです。

4

1 に答える 1

6

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自分で更新して新しい値を読み取ることができるようにする必要があります。

また、他のスレッドがインクリメントした後にインクリメントした値を読み取らないように、トランザクションでとを適切UPDATESELECTラップする必要があります。seq_tableISOLATION LEVEL

これはINSERTS、トランザクションの問題になることを意味しますが、通常はそうではないため、2番目のアプローチはお勧めしません。

于 2012-07-04T10:35:12.547 に答える