簡體   English   中英

如何在不違反FK約束的情況下在數據庫中創建項目的副本?

[英]How to create a copy of items in database without breaking FK constraints?

好的,所以我有一個像這樣的結構(不知道如何正確格式化它,但我會嘗試):

  • 位置 ,包含id, nameaddress
  • ,其中包含id, name, size和位置的外鍵。
  • Table RoomItem (例如桌子,椅子等)包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM