[英]How to create a copy of items in database without breaking FK constraints?
好的,所以我有一個像這樣的結構(不知道如何正確格式化它,但我會嘗試):
id, name
和address
。 id, name, size
和位置的外鍵。 id, name, type, value
和房間的外鍵。 假設我們使用此結構設置了一個包含十二個房間和一百個房間項目的位置。 現在,我想創建一個新位置,但是我想擁有與新位置模板完全相同的房間和房間項目。 因此,基本上,我想復制指向某個位置的所有房間並將其FK更改為新位置,以及復制所有指向上述房間的房間項目,並將其FK更改為指向新創建的房間。
我正在使用Entity Framework 4.3,但是任何來自標准c#winforms項目的可執行文件都可以正常工作。
我的問題是弄清楚如何“正確”地做到這一點。 手動完成所有操作似乎很麻煩,這意味着要像一個一個地遍歷各個房間,復制它們的所有字段並創建一個新字段,然后在保存第一個房間之后深入研究其房間項並復制它們,這樣我就擁有了ID可用。
即使將其寫出來也聽起來很混亂,那么是否有更好的方法來實現呢?
我在下面的SQL中提供了一種方法。 請注意,此答案受以下警告限制:
我的回答是沒有可用的任何開發工具或參考資料。 這意味着答案出自我的記憶。
特別是,這意味着解決方案尚未編譯; 在某些方面,其語法和語義也可能不正確。
我使用了我最了解的sql變體-Firebird。 您所需的確切語法可能會有所不同,具體取決於可用的sql。
另外,我假設變量名具有足夠的自我解釋性,因此無需進一步評論。
最后,這個答案可能會得到改善-SELECT語句的重復向我表明,有一種改進可以消除此重復。
SET TERM !! ;
CREATE TRIGGER Deep_Copy_Room FOR Location
BEFORE INSERT
POSITION 0
AS BEGIN
NEW.id = GEN_ID (id_GEN, 1);
INSERT INTO Room (id, name, size, fk)
VALUES (GEN_ID(id_GEN, 1), Roo_name, Roo_Size, NEW.id)
WHERE SELECT id, name, size, FK_id FROM Room AS Roo_Id, Roo_name, Roo_size
WHERE SELECT id, name, addrss FROM Location AS Loc_Id, Loc_name, Loc_address
WHERE fk = Copy_From_id;
INSERT INTO Item (id, name, type, value, fk_id)
VALUES (GEN_ID(id_GEN,1), Ite_name, Ite_type, Ite_value, Roo_id)
WHERE SELECT id, name, type, value, FK_id FROM RoomItem AS Ite_Id, Ite_name, Ite_type, Ite_value, Roo_Id)
WHERE SELECT id, name, size, FK_id FROM Room AS Roo_Id, Roo_name, Roo_size, Loc_id
WHERE SELECT id, name, address FROM Location AS Loc_Id, Loc_name, Loc_address
WHERE Loc_id = Copy_From_id;
END
SET TERM ; !!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.