如何在sql中插入一个新行后自动更新表中的所有其他行?

时间:2018-04-19 11:52:54

标签: sql-server tsql

我有一张这样的表格,我会保留一份约会清单,根据A和B的组合增加:

ID  A   B  Appointment  Count
-----------------------------
1  abc  0  2010-10-20   1
2  abc  0  2010-10-25   2
3  abc  0  2010-10-30   3
3  abc  1  2010-10-30   1
4  xyz  1  2010-08-18   1
5  xyz  1  2010-08-19   2
6  xyz  1  2010-08-20   3

这样的功能:

CREATE FUNCTION dbo.GenerateCount
(
   @id int,
   @A int,
   @B int,
   @appt_date date

)
RETURNS Int
AS
BEGIN

   RETURN
   (
       SELECT COUNT(*)
       FROM dbo.test_seq
       WHERE patient_id = @A
       AND B = @B
       AND id <= @id
       AND appt_date <= @appt_date
   )
END

数据插入如下:

CREATE TABLE [dbo].[test_seq](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [A] [int] NOT NULL,
    [B] [int] NOT NULL,
    [appt_date] [date] NOT NULL,
    [count] AS dbo.GenerateCount(id, A, B, appt_date)
    )

当我在表格中插入新条目时,它会按预期递增计数。但是,如果我插入一个日期在中间的新条目,请说我是否要添加:

ID  A   B  Appointment  Count
-----------------------------
1  abc  0  2010-10-21   

已分配正确的计数,但其他行未更新。如何在该日期之后触发所有其他记录的表更新,以便使用相关计数值进行更正?

我尝试在插入/更新/删除时创建一个触发器,但这只适用于要插入的行而不是整个表。

2 个答案:

答案 0 :(得分:1)

为什么不创建视图

SELECT seq.* 
     , row_number() over (partition by A, B order by Appointment, ID) as [count]
FROM dbo.test_seq seq

为什么AND id <= @id?如果你在中间插入一个日期,那就是打破东西。

答案 1 :(得分:1)

如果我说得对,那么简单的答案就是:不要!

SQL-Server-table不是Excel ...

你必须决定

  • 您是否要设置值持久(换句话说:一种)?
  • 您是否只想暂时对行进行编号?

在您的桌子上创建VIEW(根据方法you find in your last question)。

无论何时调用,都会计算出正确的数字。