![](/img/trans.png)
[英]Add a column to composite primary key that is also a foreign key in other tables
[英]Replace primary key that is foreign key in other tables
我目前正在重建用於存儲患者記錄的數據庫。 在當前數據庫中,患者的主要關鍵字是他們的姓名和出生日期(單列,即“ John Smith 1970-01-01”,它不是組合)。 這也是許多其他表中用於引用“患者”表的外鍵。 我正計划用自動生成的整數密鑰替換此密鑰(因為在當前系統下,顯然有一天會有重復的密鑰)。 如何在此表中添加新的主鍵,並在所有其他表上添加適當的外鍵? 請記住,已經有大量數據(約500,000條記錄),並且這些數據引用不能被破壞。
謝謝!
如果由我決定..
使用auto_increment將新的future-PK列添加為非空唯一索引( 它必須是KEY,但不一定是PK )。
將適當的new-FK列添加到所有相關表中,這些列最初應為空。
根據current-PK / FK關系將new-FK值設置為適當的future-PK值。 在此步驟中使用“ UPDATE .. JOIN” 。
在相關表上啟用參照完整性約束(DRI) 。 它只需要是KEY / FK,而不是PK / FK,這就是可以使用future-PK的原因。 在此步驟中,可能應該更新所有使用current-PK的現有DRI約束。
根據建模要求,刪除new-FK列的可為空性。
刪除所有殘留的舊FK列,因為它們現在是冗余數據 。
切換舊的PK和新的/將來的PK( 這可以在一個命令中完成,並且可能需要一段時間才能物理地重組所有行)。 刪除舊的PK列(如果適用),或者簡單地刪除KEY狀態。
我還將在流程中使數據庫脫機 , 檢查和測試流程(使用測試數據庫進行空運行),並維護備份 。
數據訪問層和任何視圖/等也將需要更新。 這些應該同時進行,再次通過審查和測試過程。
同樣,即使添加了自動增量PK,該表通常仍應具有適當的覆蓋范圍的自然鍵,並使用唯一約束來實施。
我使用以下方法解決了問題:
1-分配給患者表添加了新的主鍵,並為所有現有記錄分配了唯一值
2-為每個引用表創建物化視圖(無觸發器),其中包括引用表中的所有字段以及患者表中新創建的id字段(通過聯接)。
3-刪除源引用表
4-將實例化視圖重命名為原始源表的名稱
物化視圖現在是從屬表。
實例化視圖的參考: http : //www.fromdual.com/mysql-materialized-views
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.