ホームページ >データベース >mysql チュートリアル >アドレス履歴テーブルのグループ化された行に連続番号を自動的に生成するにはどうすればよいですか?

アドレス履歴テーブルのグループ化された行に連続番号を自動的に生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-07 19:42:43862ブラウズ

How Can We Automatically Generate Sequential Numbers for Grouped Rows in an Address History Table?

アドレス履歴テーブルの連続番号の自動生成

データベース内の住所履歴を管理するには、経時的な変更を追跡するための堅牢なシステムが必要です。 各個人の住所履歴の正確な連続番号を維持することが重要です。

課題:

address_history テーブルを考えてみましょう:

person_id sequence timestamp address original_address previous_address
1 1 2023-02-01 Address A NULL NULL
1 2 2023-03-01 Address B Address A NULL
2 1 2023-04-01 Address C NULL NULL

信頼性の低い自動インクリメントメカニズムに依存せずに、各 sequence に 1 から始まる連続した person_id 番号を自動的に割り当てるにはどうすればよいでしょうか?

解決策:

ギャップや不一致が生じる可能性がある自動インクリメント列に依存する代わりに、シリアル列または IDENTITY 列を主キーとして使用し、シーケンス番号を動的に生成することを提案します。

<code class="language-sql">CREATE TABLE address_history (
  address_history_id SERIAL PRIMARY KEY,
  person_id INT NOT NULL REFERENCES people(id),
  created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  previous_address TEXT
);</code>

連続番号が必要なクエリの場合、ビューを作成できます。

<code class="language-sql">CREATE VIEW address_history_with_sequence AS
SELECT *, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY address_history_id) AS sequence
FROM address_history;</code>

このアプローチでは、主キー (address_history_id) によって順序付けされたギャップのないシーケンスが保証され、必要に応じて順序付けが柔軟になります。

ベストプラクティス:

  • 正確な時間を追跡するには、TIMESTAMP WITH TIME ZONE を使用します。
  • previous_address のみを保存すると、データ効率が向上します。 多くの場合、元のアドレスは前の行の address 列から取得できます。

この方法は、アドレス履歴テーブルの連番を管理するための、より信頼性が高く効率的なソリューションを提供します。

以上がアドレス履歴テーブルのグループ化された行に連続番号を自動的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。