我有表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)
答案 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列上创建一个唯一索引。不应该允许重复,因为这会破坏映射表