自動產生位址歷史表中的序號
管理資料庫中的地址歷史記錄需要一個強大的系統來追蹤隨時間的變化。 保持每個人的地址歷史記錄準確的順序編號至關重要。
挑戰:
考慮一個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
分配連續的 person_id
數字,從 1 開始,而不依賴潛在不可靠的自動遞增機制?
解:
我們建議使用序列或 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中文網其他相關文章!