【问题标题】:Inserting to one table, insert the ID to second table插入一张表,将ID插入第二张表
【发布时间】:2018-05-15 23:09:25
【问题描述】:

当我插入第一个表时,是否可以填充第二个表?

将帖子插入表 1 -> 表 2 列接收表 1 帖子的唯一 ID。

到目前为止,我在正确的轨道上吗?

    CONSTRAINT [FK_dbo.Statistics_dbo.News_News_NewsID] FOREIGN KEY ([News_NewsID]) REFERENCES [dbo].[News] ([NewsID])

【问题讨论】:

  • 这只是你对数据库的约束,以强制执行你想要的。现在您需要编写代码。如果您遇到问题/问题,请在此处提问。但只有在你写好代码之后。

标签: sql sql-server


【解决方案1】:

方法很多:

  1. insert 触发器
  2. 在第一个 insert 之后读取 SCOPE_IDENTITY(),然后用它来做第二个
  3. 使用output 子句进行插入

例子:

1:

create trigger Foo_Insert on Foo after insert
as
begin
    set nocount on
    insert Bar(fooid)
    select id from inserted
end
go
insert Foo (Name)
values ('abc');

2:

insert Foo (Name)
values ('abc');
declare @id int = SCOPE_IDENTITY();

insert Bar(fooid)
select @id

3:

insert Bar(fooid)
select id from (
    insert Foo (Name)
    output inserted.id
    values ('abc')) x

【讨论】:

    【解决方案2】:

    我唯一能想到的是,您可以使用触发器来完成此操作。 SQL Server 没有任何“内置”功能可以做到这一点。为什么不直接从您的 .NET 代码中执行呢?

    【讨论】:

      【解决方案3】:

      是的,听起来您想要一个 SQL 触发器,这将允许您根据一个表上的操作触发逻辑,以在数据库中执行其他操作。这是另一篇关于创建简单 SQL 触发器的文章

      SQL Server 2008 - Help writing simple INSERT Trigger

      请注意,这将完成更新新表的所有逻辑,在您编写的任何 C# 代码之外,不必预先管理它可能听起来不错,但您也会失去对何时以及是否它的控制发生。

      因此,如果您以后需要做一些不同的事情,现在您必须更新常规代码以及触发代码。这种类型的逻辑肯定会在大型系统中增长,并成为维护的噩梦。考虑到这一点,替代方法是构建一个方法,在将 id 插入第一个表后将其添加到新表中。

      虽然我不知道您使用什么来进行插入,假设它是一个 SQL 命令,但您可以使用 Scope_Identity 从插入中获取标识列上的 ID,在此处找到

      How to insert a record and return the newly created ID using a single SqlCommand?

      如果是 EF 或其他一些 ORM 工具,它们应该要么自动更新实体,要么有其他机制来传递这些数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多