插入上一个插入的ID

时间:2018-04-05 14:37:18

标签: sql sql-server sql-insert

我有表A和表B的多对多关系。表AB是一个链接表。

Table:  Columns:
A       { Id, Name }
AB      { A_Id, B_Id }
B       { Id, Name }

我想在表A中插入行,然后使用该行的ID(Id具有自动增量标识)插入到链接表中。

是否可以在单个SQL命令中执行此操作?

示例(pseudo-sql):

insert into A (Name) values (@name)
insert into AB (A_Id, B_Id) values ([previous id], @b_Id)

3 个答案:

答案 0 :(得分:3)

在SQL Server中,最安全的方法是使用output子句,解释为here

declare @ids table (id int);

insert into A (Name)
    output inserted.id into @ids
    values (@name);

insert into AB (A_Id, B_Id) 
    select i.id, @b_Id
    from @ids i;

为什么output更安全?首先,它不依赖于事务或会话语义。它只是捕获实际插入的数据,并使其可用于后续语句。

其次,它可以处理多行插入(虽然在这种情况下不是问题)。

第三,它可以返回除id之外的其他列,这可能很方便。

答案 1 :(得分:-1)

您可以使用@@ IDENTITY返回最后插入的标识,请参阅https://docs.microsoft.com/en-us/sql/t-sql/functions/identity-transact-sql

答案 2 :(得分:-2)

是:

INSERT INTO A (Name) VALUES (@name)

INSERT INTO AB (A_Id, B_Id)
SELECT A.Id, @B_Id
FROM A
WHERE A.Name = @name
ORDER BY A.Id

更新:此解决方案基于在插入表AB时知道表A中需要的约束。如果表A中存在@name的预先存在的值(即重复项),则可能需要考虑添加其他约束。在不知道数据模型的情况下很难知道。虽然,我怀疑你正在使用维度表,这意味着不会有重复的值,因为预计你已经有了它的映射。

这也带来了一个好点;确保映射表上有一个包含表A和B的外键列的主键。此外,在表A的Name列上创建一个唯一索引。不应该允许重复,因为这会破坏映射表