【问题标题】:Add two rows with foreign key - SQL用外键添加两行 - SQL
【发布时间】:2011-05-26 03:35:25
【问题描述】:

我不知道如何在 1 个事务中添加 2 行,其中 1 行取决于另一行。

INSERT INTO users (username) VALUES ('malcom.reynolds')

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', <<Malcom Reynold's row ID>>)

我这样做的原因是我正在使用的库不返回 rowid,我需要尽可能少地提交事务,因为我要添加超过几百万条记录!

只是为了我正在使用的记录:

  • SQL Server 2008
  • Python
  • pyodbc

有什么想法吗?真的很棒:)

【问题讨论】:

    标签: python sql sql-server django pyodbc


    【解决方案1】:

    您可以在一个批处理语句中执行此操作:

    declare @key as int;
    insert into users (username)
    values ('malcom.reynolds');
    set @key = (select scope_identity());
    insert into spaceships (name, owner)
    values ('Serenity', @key)
    

    【讨论】:

    • 感谢您添加declare 行,它运行良好! :)
    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/aa259185%28SQL.80%29.aspx

    INSERT INTO users (username) VALUES ('malcom.reynolds');
    
    INSERT INTO spaceships (name, owner) 
    VALUES ('Serenity', SCOPE_IDENTITY() )
    

    【讨论】:

      【解决方案3】:

      您可以使用 T-SQL scope_identity 从第一个 INSERT 语句返回新 ID。

      在您的第一个 INSERT 之前,声明一个变量来保存新 ID 的值:

      DECLARE @ReturnValue int;
      

      在您的第一个 INSERT 之后,添加以下内容以设置该变量的值:

      SELECT @ReturnValue = scope_identity()

      然后,您可以在第二个 INSERT 中使用 @ReturnValue 变量来代替:

      INSERT INTO spaceships (name, owner) 
      VALUES ('Serenity', @ReturnValue)
      

      【讨论】:

      • 感谢您的精彩回复,它最初不起作用,因为我必须声明变量并且我对 T-SQL 有点缺乏经验。感谢您的解释:D
      • @RadiantHex:感谢您的反馈。我已经为未来的读者更新了我的示例。
      【解决方案4】:

      或者您可以使用 OUTPUT。当您需要返回多个字段或开始进行多行插入时,这是更有效的。如果您正在执行多行而不是 int 变量,则可以使用 table 变量。

      DECLARE @key int
      insert into users (username)
      output inserted.userid 
      values ('malcom.reynolds'); 
      
      insert into spaceships (name, owner) 
      values ('Serenity', @key) 
      

      【讨论】:

        猜你喜欢
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多