2012-08-16 56 views
1

好了,所以我有这样的结构(不知道如何正确的格式,但我会尽力):如何在不破坏FK限制的情况下创建数据库中的项目副本?

  • 位置,包含id, nameaddress
  • ,其中包含id, name, size和外键的位置。
  • RoomItem(思桌子,椅子等),包含id, name, type, value和外键的房间。

因此,假设我已经使用这种结构设置了一个有十几个房间和一百个房间的地点。现在我想创建一个新的位置,但我想要为新位置创建一个完全相同的房间和房间模板作为模板。所以基本上我想要复制指向特定位置的所有房间,并将其FK更改为新位置,以及复制指向所述房间的所有房间项目,并将其FK更改为指向新创建的房间。

我使用实体框架4.3,但任何一个标准的C#WinForms项目可执行文件会工作得很好。

而我的问题是搞清楚如何“正确地”做到这一点。手动完成这一切似乎相当麻烦,这意味着像一个接一个穿过房间,复制所有的领域并创建一个新的领域,然后更深入地探究其房间并复制它们,保存第一个房间后,我有它ID可用。

甚至写了这一点听起来很混乱,所以有没有实现这一点的一个更好的办法?

回答

0

我提供了一种在SQL中执行此操作的方法。请注意,这个答案是受以下注意事项:

我无需提供任何展具,或参考材料回答。这意味着答案来自我的记忆。

特别是这意味着该解决方案尚未编译;在某些方面它的语法和语义也可能不起作用。

我已经使用了我最熟悉的sql变种 - 火鸟。您需要的确切语法可能会有所不同,具体取决于您可以使用的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 ; !! 
+0

谢谢,所以我猜“手动”选项是在这种情况下唯一的选择。 – bobblez 2012-08-16 08:51:50

相关问题