Sql-Server

創建指定外鍵匹配的所有行的副本,然後替換外鍵

  • December 10, 2018

我是數據庫管理的新手(這是我的第一次),我的任務是創建一個數據庫,該數據庫的功能允許使用者選擇“模型”作為目前狀態,然後可以將其用作新的預設/基線編輯時的模型。

我的問題是,如何從多個表中複製外鍵與所選模型的 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。我們可能會:

  1. 通過簡單查詢獲取
SELECT id FROM Main WHERE Name = 'New Name Value'

然後在查詢中使用此值,將數據添加到引用此記錄的表詳細資訊中

INSERT INTO Details (Main_ID, Detail) VALUES ('obtained ID value', 'New Detail value')
  1. 不要單獨獲取 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 @@identityID select ident_curent(‘tablename’)

引用自:https://dba.stackexchange.com/questions/224545