一. 業務場景
業務流程需要進行寫入和更新的比較,所以有原表和歷史表。
要求表中的ID唯一性,以及兩張表的ID關聯,另外後續可能數據庫會進行遷移
二.方案選擇
方案一:id設置為int型自增長。
這種做法編程簡單,無需考慮id唯一性,由數據庫幫忙維護。但是在此業務場景下存在缺點
1. 這裡存在兩張表關聯。id自增長無法確保數據唯一性,也就無法保證原表與歷史表進行數據映射。比如說,現在需要向原表A和歷史表A_HISTORY表中插入相同的一條數據。插入A表後,發現無法取到A表的ID(A表的ID是主鍵,根據其他條件無法確保數據的唯一性)也就無法保證A_HISTORY表與A表能到插入相同的一條數據
2. 因為後期需要進行數據庫的遷移,而ID自增長的。在數據遷移過程中可能會發生錯誤
方案二:利用虛擬表dual表
dual表是系統表,有SYS用戶創建,默認在system表空間下,與用戶表空間分開的。通過在dual表中創建序列既可以進行表ID的唯一性控制。
三.實現
1. 可視化操作
在oracle工具sql developer中。在system表空間schema目錄。建立序列Update_sequence,設置遞進步長,最小值、最大值等。
2.sql 語句
create SEQUENCE Update_sequence
INCREMENT BY 1 MAXVALUE 5000 CYCLE;
兩種方法都可以創建序列,向表中插入數據時就可以使用
SELECT UPDATE_SEQUENCE.NEXTVAL FROM DUAL
作為原表和歷史表的ID。這樣既保證了id的唯一性,也確保了原表與歷史表的數據能夠映射起來