有没有更好的方法来通过索引而不是列名更新数据库?

Yu *_*ang 2 sql sql-server

在此输入图像描述

上面是我的数据库的截图,

  • 每行代表一个任务
  • 已审核时间表示审核任务的次数,最多可设置为9次.
  • FirstReview,SecondReview ... TenthReview表示DateTime审查此给定任务.

我目前的做法是:

  1. 对于给定任务,请阅读其"已审核时间"列值,N
  2. 使用几个if-else(或switch)语句块,更新(N + 1)thReview列.

例如,对于一个给定的任务,其ReviewedTimes列读取3,我会更新FourthReview一个新的列DateTime值.

是否有更优雅的方式来实现同一目标?我在想:

  • 如果我可以以某种方式枚举FirstReview,SecondReview ... TenthReview为1,2 ... 10
  • 根据ReviewsTimesN,我可以分别更新列N + 1.

Rya*_*son 5

正如我在上面的评论中所建议的那样,Tasks与Reviews有一对多的关系,要做我在SQL Server中建议的事情,你需要先从任务表中删除所有的Review Columns:

 ALTER TABLE [dbo].[Tasks]
    DROP COLUMN [FirstReview], DROP COLUMN [SecondReview], etc...
Run Code Online (Sandbox Code Playgroud)

然后创建一个名为Review的新表,该表具有Task表主键的外键,假设您在Tasks中有一个名为TaskId的Identity列:

 CREATE TABLE [dbo].[Reviews] ([ReviewId] INT NOT NULL Identity(1, 1) PRIMARY KEY, [TaskId] INT NOT NULL References [dbo].[Tasks]([TaskId]), [TimeStamp] DateTime NOT NULL)
Run Code Online (Sandbox Code Playgroud)

现在当有人去审查任务项时,您首先要检查是否已达到审核限制,在查看表上使用COUNT()获取给定的任务ID,如果尚未到达,则插入新的记录Review Table中的任务查看,Task Id为TaskID列值,CURRENT_TIMESTAMP返回Review的日期时间.如果您正在跟踪审核任务的人员,那么您将使用用户ID的外键向Review添加另一列,但这只是另一个建议.