【问题标题】:Create trigger to automatically insert row in other table first创建触发器以首先在其他表中自动插入行
【发布时间】:2013-07-04 10:06:35
【问题描述】:

我的 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);

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

非常感谢!

【问题讨论】:

  • 您可以将数据导入中间表“VoyageImport”。此表上的触发器可以更新另外两个表。然后可以定期清除 VoyageImport 表。我知道不是很优雅,但这是一种方法。
  • 你应该使用存储过程来做到这一点。
  • 允许我阻止在这种情况下使用任何类型的触发器吗?如果您生成了多个新国家/地区,会发生什么?您希望如何获得不同的 ID?
  • @Nenad:没想到。我会试一试!谢谢!

标签: sql triggers sql-server-2012


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!正是我需要的!!再次感谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-07
  • 2023-03-31
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多