【问题标题】:Delete and Update in same time in mssql在 mssql 中同时删除和更新
【发布时间】:2017-12-27 13:11:39
【问题描述】:

我在 mssql 服务器上有一份删除工作。但我希望在删除之前更新另一个表。 我有两个通过“user_id”列连接的表,我的表名是“UserInfo”和“AdvertInfo”,它们与 user_id 列连接。我将在 7 天后删除 give_advert_day。但是当它被删除时,我想增加(+1)user_advert_number 列。如果在 user_id 中删除,从表中删除 3 或 4 等数据,则来自它们的连接数据将增加 +3、+4 或蚀刻。有办法吗? 这是我的删除命令

Delete from AdvertInfo where advert_id In (
select advert_id from AdvertInfo
 where advert_begin_date <  DATEADD(day, -7, GETDATE()))

【问题讨论】:

  • 你看过触发器吗?
  • 更新后可以使用此表中的触发器自动删除。
  • 我没有关于触发器的信息,所以我做不到。

标签: sql-server sql-update command sql-delete sql-job


【解决方案1】:

你可以UPDATEJOIN:

UPDATE u
SET u.user_advert_number = u.user_advert_number + 1
FROM UserInfo as u
INNER JOIN AdvertInfo AS a ON u.user_id = a.user_id
WHERE a.advert_begin_date <  DATEADD(day, -7, GETDATE()))

顺便说一句,你的删除子句可以写成如下:

Delete 
from AdvertInfo 
where advert_begin_date <  DATEADD(day, -7, GETDATE()))

不需要IN 谓词。


您还可以创建一个create a trigger,以执行after delete,例如以您想要的方式更新列。

【讨论】:

  • 非常感谢。但是在 sql server 代理工作中会是同一时间吗?它必须更新广告中的删除时间。
  • @KAYA - 是的,您可以在有现在问题的工作中使用它,并且您可以在彼此之后使用两个查询,但在这种情况下将首选触发器。
【解决方案2】:

使用下面的查询来实现您想要的:

DECLARE @Temp TABLE (
    [user_id] INT
)

DELETE i
OUTPUT deleted.[user_id] INTO @Temp
FROM AdvertInfo i
WHERE advert_begin_date <  DATEADD(day, -7, GETDATE())

UPDATE u
SET u.user_advert_number = u.user_advert_number + d.cnt
FROM UserInfo as u
    INNER JOIN (
        SELECT [user_id], COUNT([user_id]) AS cnt
        FROM @Temp
        GROUP BY [user_id]
    ) d ON d.[user_id] = u.[user_id]

【讨论】:

    【解决方案3】:

    梅哈巴卡亚, 也许你可以使用SQL OUTPUT clause如下 您可能已经知道,在执行 DELETE 命令时,您可以使用 OUTPUT 子句将受影响的数据放入变量表中,正如您在下面的示例中看到的,您可以稍后使用它

    DECLARE @Deleted table (  
        user_id int
    );  
    
    DELETE FROM AdvertInfo
    OUTPUT DELETED.user_id
    INTO @Deleted 
    WHERE advert_begin_date <  DATEADD(day, -7, GETDATE())
    
    update u
    set user_advert_number = isnull(user_advert_number,0) + 1
    from UserInfo as u
    inner join @Deleted d on d.user_id = u.user_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 2020-03-10
      • 2012-11-09
      相关资源
      最近更新 更多