0

我的 SQL 2012 数据库中有两个表。表:航程和国家。

Voyages 表包含信息“destinationID”(表示相应的 countryID)。Voyages 的数据是从一个包含国家名称的文本文件中导入的。我想要实现的是以下内容:

  1. 当向 Voyages 表添加新行时,将首先向 Country 表添加新行(生成新的 countryID 并插入国家名称)。
  2. 添加新的 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);

有没有更优雅的方法来做到这一点?

非常感谢!

4

1 回答 1

2

我在评论中提到了存储过程作为此类问题的最佳解决方案。这是一个示例:

CREATE PROCEDURE uspInsertVoyage
(
    @voyageID INT, 
    @destinationString NVARCHAR(50)
)
AS
BEGIN

    DECLARE @destinationID INT;

    IF NOT EXISTS (SELECT * FROM Countries WHERE countryName = @destinationString)
    BEGIN
        INSERT INTO countries (countryName) VALUES (@destinationString)
    END;

    SELECT @destinationID = countryID FROM Countries WHERE countryName = @destinationString;

    INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (@voyageID, @destinationID, NULL);

END
于 2013-07-04T11:16:48.227 回答