【问题标题】:Update a table and insert missing records更新表并插入缺失的记录
【发布时间】:2018-06-13 15:20:13
【问题描述】:

我有一个带有一些 NULL 记录的外键列的表。我可以选择缺少列的记录,例如:

SELECT * FROM Outgoing WHERE Receipt_Id IS NULL

现在,对于每条记录,我想在表Receipts 中插入一条新记录,获取插入记录的Id 并将其设置为该记录中Receipt_Id 的值。

这可能在查询中吗?

【问题讨论】:

  • Outgoing table的*部分是否有ID或唯一列?
  • 您正在影响多个表,因此必须使用多个语句。但这不会太难完成。
  • @DhruvJoshi 是的。两个表都有Id作为主键
  • @AlirezaNoori 那么为什么不在 Outgoing 表中执行 Receipt_id =id 呢?我真正的意思是您是否将 Outgoing.Id 插入到收据表中?
  • @DhruvJoshi 但我希望Receipts 表中的Id 在该列中,而不是Outgoing 表中的Id。否则它不会是外键,对吧?

标签: sql sql-server sql-server-2016


【解决方案1】:

您似乎正在寻找inserted

INSERT INTO Receipts (col1, col2....)
OUTPUT INSERTED.*
INTO @CreatedIds -- TEMP TABLE WHICH HOLDS RECENTLY INERTED DATA INCLUDING Receipt_Id (pk)
SELECT col1, col2.... 
FROM Outgoing 
WHERE Receipt_Id IS NULL

到,查看最近插入的记录

SELECT c.*
FROM @CreatedIds c -- Note this is a table variable that you need to manual create.

【讨论】:

  • 对不起,除非我遗漏了什么,在您的声明中有一个 InsertSelect 它在哪里使用插入的 ID 并更新记录。不应该有Update 声明吗?
  • 您在@CreatedIds 中有插入的ID。在更新语句中使用它。
  • 好吧,我不知道要使用哪个更新语句。老实说,这是问题的主要部分
  • 你没有像我问的那样发布插入语句。您没有发布表定义。这不是我们猜测您需要什么的编码服务。
  • @paparazzo 抱歉耽搁了。没看到。已评论。
【解决方案2】:

更新:因为您仅将 Receipt 表用作序列表。您应该遵循使用序列的更新方法

更新答案:

您需要做的就是创建一个序列,比如 Receipts,而不是一个包含一列的表。然后用序列号更新 Outgoing 表。

   --create table Outgoing ( id int Primary Key IDENTITY(1,1),data nvarchar(100), record_id int);
--insert into Outgoing values ('john',NULL),('jane',NULL),('jean',NULL);

create sequence dbo.receipts as int start with 1 increment by 1;

update Outgoing
set record_id= NEXT VALUE FOR dbo.receipts
where record_id is null

select * from Outgoing

See working demo

下面的旧答案

如果您在两个表中都有ID 列,您可以根据此列将Receipt_Id 更新回Outgoing 表中

所以你的步骤是: 1. 插入记录

DECLARE @LastRID bigint 
SELECT @LastRID= MAX(Id) FROM Receipts
INSERT INTO Receipts(<col list>)
SELECT <col list> FROM Outgoing WHERE Receipt_Id IS NULL

使用 CHECKSUM 函数根据从 Outgoing 插入到收据的所有列的唯一性更新记录

update O
set O.Receipt_Id=R.Id
From Outgoing  O
Join Receipts R 
on CHECKSUM(o.<col list>)=CHECKSUM(R.<col list>)
and R.Id>@LastRID

【讨论】:

  • 运行它说当IDENTITY_INSERT 设置为OFF 时无法插入显式值。
  • @AlirezaNoori 当您尝试插入 IDENTITY 列时会发生这种情况。我怀疑您的col listINSERT INTO Receipts(&lt;col list&gt;) SELECT &lt;col list&gt; FROM Outgoing WHERE Receipt_Id IS NULL 部分中不正确
  • @AlirezaNoori 在这部分,你需要告诉我你用什么代替了Col list
  • 我只使用一列。 Id
  • 我只是将其设置为 ON,但不幸的是出现了问题。某些行会为 Receipts 表中的 Id 创建重复值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多