如何在一个命令中插入/更新到两个相关表中?

时间:2010-07-27 15:49:32

标签: c# sql-server database-design normalization

存在一个包含两个表的数据库

  • Data_t:DataID主键即 身份1,1。还有另一个领域 '左'TINYINT
  • Data_Link_t:DataID PK和FK在哪里 DataID必须存在于Data_t中。还有另一个字段'RIGHT'SMALLINT

从微软访问环境进入C#和sql server我正在寻找一种将记录导入此关系的好方法。

记录包含属于此联接两侧的信息(可能一次插入/更新超过5000条记录)。在某种LINQ列表类型命令中处理整个批处理的奖励,但即使这是按记录完成记录,关键目标是该记录的两个方面应该在同一步骤中处理。

有无数的方法,我看太多,无法确定我应该走哪条路,所以我想更快地问一般公众。 LINQ是使用LINQ to SQL插入/更新这样的大列表的选项吗?我应该记录吗?我应该使用什么方法将记录添加到规范化表中,这些表在连接时创建完整记录?

2 个答案:

答案 0 :(得分:2)

听起来像我写一个小的存储过程并从C#调用它的情况 - 例如作为我的Linq-to-SQL数据上下文对象的函数。

类似的东西:

CREATE PROCEDURE dbo.InsertData(@Left TINYINT, @Right SMALLINT)
AS BEGIN
   DECLARE @DataID INT

   INSERT INTO dbo.Data_t(Left) VALUES(@Left)

   SELECT @DataID = SCOPE_IDENTITY();

   INSERT INTO dbo.Data_Link_T(DataID, Right) VALUES(@DataID, @Right)
END

如果将其导入数据上下文,可以将其称为:

using(YourDataContext ctx = new YourDataContext)
{
   foreach(YourObjectType obj in YourListOfObjects)
   {
      ctx.InsertData(obj.Left, obj.Right)
   }
}

让存储的proc处理所有其余的(所有细节,比如确定并使用第二个表中第一个表中的IDENTITY)。

答案 1 :(得分:0)

我自己从未尝试过,但您可以通过创建可更新的视图然后在视图中插入记录来完全满足您的要求。

<强>更新

我刚试过它,看起来它看起来不会起作用。

  

Msg 4405,Level 16,State 1,Line 1   视图或函数'Data_t_and_Data_Link_t'不可更新,因为修改会影响多个基表。

我想这对于所有关系数据库理论纯粹主义者来说都是仇恨SQL Server的另一件事。

另一个更新

进一步的研究已经找到了一种方法。它可以通过视图和“代替”触发器来完成。

create table Data_t 
(
    DataID int not null identity primary key,
    [LEFT] tinyint,
)
GO

create table Data_Link_t 
(
    DataID int not null primary key foreign key references Data_T (DataID),
    [RIGHT] smallint,
)
GO

create view Data_t_and_Data_Link_t 
as
select
    d.DataID,
    d.[LEFT],
    dl.[RIGHT]
from
    Data_t d
    inner join Data_Link_t dl on dl.DataID = d.DataID 
GO

create trigger trgInsData_t_and_Data_Link_t on Data_t_and_Data_Link_T
instead of insert
as
insert into Data_t ([LEFT]) select [LEFT] from inserted 
insert into Data_Link_t (DataID, [RIGHT]) select @@IDENTITY, [RIGHT] from inserted
go

insert into Data_t_and_Data_Link_t ([LEFT],[RIGHT]) values (1, 2)