Sql-Server
創建指定外鍵匹配的所有行的副本,然後替換外鍵
我是數據庫管理的新手(這是我的第一次),我的任務是創建一個數據庫,該數據庫的功能允許使用者選擇“模型”作為目前狀態,然後可以將其用作新的預設/基線編輯時的模型。
我的問題是,如何從多個表中複製外鍵與所選模型的 Model_ID 匹配的每一行,然後在新模型中使用?
這是否需要將表中的行選擇到 tempdb 中,然後重新插入到 originaldb 中,對於這樣的任務來說,這似乎相當耗費資源。有更好的解決方案嗎?
我附上了我創建的數據庫設計的 img 以防萬一它有用。非常感謝您的幫助和建議,謝謝。
更新
在接受了 Akina 的建議後,這是我關於如何複製行以供使用者使用的計劃(虛擬碼)。如果有任何明顯的錯誤,請隨時糾正。
@X int -- the selected existing Model taken as a paremeter @new_model_Name -- fields to be entered into the model table @new_model_completionUser -- fields to be entered into the model table @new_model_dateCreated -- fields to be entered into the model table insert into model values (new_model_Name, new_model_completionUser, new_model_dateCreated) insert into table1 (old_data1, old_data2,..., New_Model_ID) select * from table1 where Model_ID = X insert into table2 (old_data1, old_data2,..., New_Model_ID) select * from table2 where Model_ID = X --etc
建模算法。
假設我們有包含欄位 ID 和名稱的主表。假設我們通過 ID_Main 欄位 (FK) 將表 Details 引用到 Main 表並具有 Detail 欄位。
假設我們從具有某個名稱的表 Main 中選擇了具有某個 ID 的記錄。我們更改了這個名稱,現在我們要創建新的記錄包 - 使用新名稱和源記錄中的 Detail 值的副本。
首先,我們必須確保主表中不存在新的名稱值(我們不喜歡完全重複,是嗎?)。所以我們查詢
SELECT COUNT(*) FROM Main WHERE Name = 'New Name Value'
並檢查其結果是否為零(‘0’)。如果沒有,這個值已經存在,我們告訴操作員。
如果返回的值為零,我們可以儲存數據。我們用查詢插入它
INSERT INTO Main (Name) VALUES ('New Name Value')
記錄被插入,並為其假定了一些 ID。我們可能會:
- 通過簡單查詢獲取
SELECT id FROM Main WHERE Name = 'New Name Value'
然後在查詢中使用此值,將數據添加到引用此記錄的表詳細資訊中
INSERT INTO Details (Main_ID, Detail) VALUES ('obtained ID value', 'New Detail value')
- 不要單獨獲取 ID,在 INSERT 查詢中執行此操作
INSERT INTO Details (Main_ID, Detail) SELECT id, 'New Detail value' FROM Main WHERE Name = 'New Name Value'
PS。對於 SQL Server,您可以使用 或根據您的需要獲取最後一條記錄
select scope_identity()
的select @@identity
IDselect ident_curent(‘tablename’)
。