ホームページ >データベース >mysql チュートリアル >アドレス履歴テーブルのグループ化された行に連続番号を自動的に生成するにはどうすればよいですか?
アドレス履歴テーブルの連続番号の自動生成
データベース内の住所履歴を管理するには、経時的な変更を追跡するための堅牢なシステムが必要です。 各個人の住所履歴の正確な連続番号を維持することが重要です。
課題:
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 サイトの他の関連記事を参照してください。