-- ============================================================================ -- 【手動數據庫遷移腳本】版本追踪系統 -- 如果自動遷移失敗,請由數據庫管理員手動執行此腳本 -- ============================================================================ -- 【步驟 1】添加 is_latest 字段 -- 用於標記該交易版本是否為最新版本(true = 最新,false = 已過時) ALTER TABLE journal_entries ADD COLUMN IF NOT EXISTS is_latest BOOLEAN DEFAULT true; -- 【步驟 2】添加 revision_count 字段 -- 用於追踪修正版本(1 = 原始,2 = 第一次修正,3 = 第二次修正,...) ALTER TABLE journal_entries ADD COLUMN IF NOT EXISTS revision_count INTEGER DEFAULT 1; -- 【步驟 3】添加 original_entry_id 字段 -- 用於指向原始交易 ID(NULL = 這是原始交易,>0 = 這是對ID的修正版本) ALTER TABLE journal_entries ADD COLUMN IF NOT EXISTS original_entry_id INTEGER; -- 【步驟 4】創建性能索引 -- 用於快速查詢最新版本的交易(試算表查詢會經常使用) CREATE INDEX IF NOT EXISTS idx_journal_entries_is_latest ON journal_entries(is_latest, entry_date DESC); -- 【步驟 5】創建追踪索引 -- 用於快速查詢指定交易的所有修正版本 CREATE INDEX IF NOT EXISTS idx_journal_entries_original_id ON journal_entries(original_entry_id) WHERE original_entry_id IS NOT NULL; -- ============================================================================ -- 【驗證】 -- ============================================================================ -- 執行以下查詢確認字段已添加: SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_name = 'journal_entries' AND column_name IN ('is_latest', 'revision_count', 'original_entry_id') ORDER BY ordinal_position DESC; -- 查詢索引是否已創建: SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'journal_entries' AND indexname LIKE 'idx_journal_entries%'; -- ============================================================================ -- 【可選】數據初始化 -- ============================================================================ -- 如果表中已有舊數據,執行以下操作以確保一致性: -- 使用 begin;...commit; 作為事務邊界 BEGIN; -- 確保所有現有交易都被標記為最新版本 UPDATE journal_entries SET is_latest = true WHERE is_latest IS NULL; -- 確保所有現有交易的 revision_count 都至少為 1 UPDATE journal_entries SET revision_count = 1 WHERE revision_count IS NULL; -- 提交更改 COMMIT; -- ============================================================================ -- 【完成】 -- ============================================================================ -- 遷移完成!系統現在支持版本追踪。 -- -- 關鍵概念: -- - is_latest = true: 當前最新版本,應該在試算表和列表中顯示 -- - is_latest = false: 已過時的版本,通常只在修正歷史中顯示 -- - revision_count: 版本編號(1=原始,2=第一次修正,...) -- - original_entry_id: 指向原始交易,NULL 表示這是原始交易 -- -- 常見查詢: -- 1. 獲取所有最新交易(用於試算表): -- SELECT * FROM journal_entries WHERE is_latest = true AND is_deleted = false; -- -- 2. 獲取指定交易的修正歷史: -- SELECT * FROM journal_entries -- WHERE journal_entry_id = 123 OR original_entry_id = 123 -- ORDER BY revision_count ASC; -- -- 3. 獲取修正後的版本: -- SELECT * FROM journal_entries -- WHERE original_entry_id IS NOT NULL AND is_latest = true; -- -- ============================================================================