【问题标题】:How to add data to two tables linked via a foreign key?如何将数据添加到通过外键链接的两个表中?
【发布时间】:2010-11-05 19:48:33
【问题描述】:

如果我有 2 个表,请将它们称为 TableA 和 TableB。 TableB 包含一个引用 TableA 的外键。我现在需要为给定场景将数据添加到 TableA 和 TableB 中。为此,我首先必须在 TableA 中插入数据,然后查找并检索 TableA 最后插入的主键,并将其用作 TableB 中的外键值。然后我在 TableB 中插入值。这似乎有点像插入一组数据的工作。我还能如何实现这一目标?如果可能,请向我提供 SQL Server 2005 的 SQL 语句。

【问题讨论】:

    标签: sql sql-server database sql-server-2005 foreign-keys


    【解决方案1】:

    这听起来很对。请注意,您可以在每行的基础上使用SCOPE_IDENTITY(),或者如果您使用 INSERT/OUTPUT 语法,则可以执行基于集合的操作,然后加入第一个插入的输出集合 - 例如,这里我们只有 1 个 INSERT(每个)插入“真实”表:

    /*DROP TABLE STAGE_A
    DROP TABLE STAGE_B
    DROP TABLE B
    DROP TABLE A*/
    SET NOCOUNT ON
    
    CREATE TABLE STAGE_A (
        CustomerKey varchar(10),
        Name varchar(100))
    CREATE TABLE STAGE_B (
        CustomerKey varchar(10),
        OrderNumber varchar(100))
    
    CREATE TABLE A (
        Id int NOT NULL IDENTITY(51,1) PRIMARY KEY,
        CustomerKey varchar(10),
        Name varchar(100))
    CREATE TABLE B (
        Id int NOT NULL IDENTITY(1123,1) PRIMARY KEY,
        CustomerId int,
        OrderNumber varchar(100))
    
    ALTER TABLE B ADD FOREIGN KEY (CustomerId) REFERENCES A(Id);
    
    INSERT STAGE_A VALUES ('foo', 'Foo Corp')
    INSERT STAGE_A VALUES ('bar', 'Bar Industries')
    INSERT STAGE_B VALUES ('foo', '12345')
    INSERT STAGE_B VALUES ('foo', '23456')
    INSERT STAGE_B VALUES ('bar', '34567')
    
    DECLARE @CustMap TABLE (CustomerKey varchar(10), Id int NOT NULL)
    
    INSERT A (CustomerKey, Name)
    OUTPUT INSERTED.CustomerKey,INSERTED.Id INTO @CustMap
    SELECT CustomerKey, Name
    FROM STAGE_A
    
    INSERT B (CustomerId, OrderNumber)
    SELECT map.Id, b.OrderNumber
    FROM STAGE_B b
    INNER JOIN @CustMap map ON map.CustomerKey = b.CustomerKey
    
    SELECT * FROM A
    SELECT * FROM B
    

    【讨论】:

    • 谢谢 Marc...这正是我要找的...它在我的永久书签上。
    【解决方案2】:

    如果您直接使用 SQL,那么您就有了正确的解决方案。

    如果您从代码执行插入,您可能有更高级别的结构来帮助您实现这一点(LINQ、Django 模型等)。

    【讨论】:

      【解决方案3】:

      如果您打算在直接 SQL 中执行此操作,我建议创建一个将所有数据作为参数的存储过程,然后在事务中执行插入/选择身份/插入步骤。尽管该过程仍然与您的手动插入相同,但使用存储过程将使您可以更轻松地从代码中使用它。正如@Rax 提到的,您也可以使用 ORM 来获得类似的功能。

      【讨论】:

        猜你喜欢
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多