【发布时间】:2013-07-04 10:06:35
【问题描述】:
我的 SQL 2012 数据库中有两个表。表:航程和国家。
Voyages 表包含信息“destinationID”(代表相应的 countryID)。 Voyages 的数据是从一个包含国家名称的文本文件中导入的。 我想要实现的目标如下:
- 向 Voyages 表添加新行时,将首先向 Country 表添加新行(生成新的 countryID 并插入国家/地区名称)。
- 添加新的 Country 行后,生成的 countryID 将用于插入新的 Voyages 行(将 countryID 设置为 destinationID)。
我知道我可以在我的应用程序中通过解析文本文件、提取国家名称并将其添加到数据库中以获取新的 countryID 来执行此操作。然后我可以使用新 ID 添加一个新的 Voyages 行。但我也可以在数据库中完成整个工作吗?我考虑过使用触发器。
但是我会遇到一个问题,我最初必须在 Voyages 表中插入一个国家名称字符串,而最后我想插入一个 countryID (int)。
这将是某种我真的不喜欢的解决方法:
INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (1, 0, "BRAZIL");
像这样,我可以创建一个触发器 (INSTEAD OF INSERT) 来提取destinationString 以插入一个新的国家行:
INSERT INTO countries (countryName) VALUES ("BRAZIL");
然后可以在我的触发器中使用生成的 countryID(例如 27)来最终将新行插入到航程中:
INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (1, 27, NULL);
有没有更优雅的方法来做到这一点?
非常感谢!
【问题讨论】:
-
您可以将数据导入中间表“VoyageImport”。此表上的触发器可以更新另外两个表。然后可以定期清除 VoyageImport 表。我知道不是很优雅,但这是一种方法。
-
你应该使用存储过程来做到这一点。
-
允许我阻止在这种情况下使用任何类型的触发器吗?如果您生成了多个新国家/地区,会发生什么?您希望如何获得不同的 ID?
-
@Nenad:没想到。我会试一试!谢谢!
标签: sql triggers sql-server-2012