MySQL の自動インクリメントされるレコード ID は、一意の識別子を生成するための基本メカニズムを提供します。ただし、Oracle のシーケンスの柔軟性が必要なシナリオの場合は、カスタム ソリューションが必要です。
実装の詳細:
CREATE FUNCTION get_next_sequence(sequence_name VARCHAR(255)) RETURNS INT BEGIN DECLARE next_sequence INT; START TRANSACTION; UPDATE sequences SET next_sequence = next_sequence + 1 WHERE sequence_name = sequence_name FOR UPDATE; SELECT next_sequence INTO next_sequence FROM sequences WHERE sequence_name = sequence_name; COMMIT; RETURN next_sequence; END
CREATE FUNCTION get_current_sequence(sequence_name VARCHAR(255)) RETURNS INT BEGIN DECLARE current_sequence INT; SELECT next_sequence INTO current_sequence FROM sequences WHERE sequence_name = sequence_name; RETURN current_sequence; END
使用例:
-- Obtain the next sequence number for the "OrderNumber" sequence SELECT get_next_sequence('OrderNumber') AS next_order_number; -- Get the current value of the "InvoiceNumber" sequence SELECT get_current_sequence('InvoiceNumber') AS current_invoice_number;
注:
このソリューションでは、シーケンス テーブルで単一行ロックを使用して、同時実行の問題を防ぎます。明示的な COMMIT ステートメントや ROLLBACK ステートメントでストアド プロシージャを使用するなどの代替アプローチを使用して、目的の動作を実現することもできます。
以上がMySQL で Oracle シーケンスをシミュレートするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。