【问题标题】:How can I set the primary key value to other col in table when I insert a new row in SQL Server在 SQL Server 中插入新行时,如何将主键值设置为表中的另一列
【发布时间】:2012-12-25 06:58:23
【问题描述】:

我正在使用 LINQ-to-SQL 类。我正在使用 LINQ 方法 object.InsertOnSubmit() 插入一个新行。

我需要为表主键列设置由 SQL Server 生成的相同值(使用Identity)。

现在我在向表中插入新行时需要相同的值。并且仅在插入时为同一表中的其他列设置相同的值。

因为表有 UPDATE TRIGGER,所以插入后我无法更新。

我尝试了以下

_db.EmpNews.InsertOnSubmit(_EmpNews);
...
_db.DisplaySeq = _EmpNews.ID;
...
_db.SubmitChanges();

其中ID 是自动生成的 (Identity) 列。

【问题讨论】:

  • 我实际上为此想出了一个不错的“hack”。我只是添加一个SecondPrimaryKeyColumn ,默认值为NULL。在我插入或在事务中立即运行UPDATE table SET SecondPrimaryKeyColumn = PrimaryKeyColumn WHERE SecondPrimaryKeyColumn IS NULL;

标签: c# sql-server linq linq-to-sql


【解决方案1】:

第一个问题确实是:为什么您需要将相同的值存储在同一个表的两个单独的列中?你需要这个做什么?对我来说似乎没有多大意义......

由于IDENTITY 列的值仅在行实际插入后才可用,因此无法获取该值并将其设置为另一个该行之前的列确实已保存到数据库表中。

这基本上留下了三个选项来获取该值并将其存储在其他地方:

  • 您可以编写一个 AFTER INSERT 触发器,将 other 列设置为刚刚插入到 IDENTITY 列中的值

  • 1234563 987654325@ 值并使用该新值再次更新该行。但这会导致UPDATE 发生 - 你似乎说这是不可能的,因为UPDATE 触发器(不太清楚为什么这应该是一个问题......)
  • 您可以编写两行 C# 代码来获取插入后的 IDENTITY 值(并且在对象的 ID 属性中可用),然后再次存储该对象。但这也会导致 UPDATE 发生 - 你似乎说这是不可能的,因为 UPDATE 触发器(不太清楚为什么这应该是一个问题.. ..)

所以我想您最好的选择是使用INSERT 触发器来执行此操作。

试试这样的:

CREATE TRIGGER trInsertEmpNews 
ON dbo.EmpNews AFTER INSERT 
AS BEGIN
    UPDATE dbo.EmpNews 
    SET DisplaySeq = i.ID
    FROM INSERTED i
    WHERE dbo.EmpNews.ID = i.ID
END

【讨论】:

  • 我需要在其他列中存储相同的值,因为我需要更新此值以用于某些显示目的但无法对 ID 执行操作
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多