我在下面提供了一种在 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 ; !!