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

时间:2018-03-09 17:30:20

标签: sql sql-server

enter image description here

以上是我的数据库的截图

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

我目前的做法是:

  1. 对于给定任务,请阅读已审核时间列值N
  2. 使用几个if-else(或switch)语句块,更新(N + 1)thReview 列。
  3. 例如,对于给定任务,其已审核时间列读取3,我将使用新的DateTime值更新 FourthReview 列。

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

    • 如果我能以某种方式枚举 FirstReview SecondReview ... TenthReview 为1,2 ... 10
    • 根据已审核时间 N ,我可以分别更新 N + 1 列。

1 个答案:

答案 0 :(得分:5)

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

 ALTER TABLE [dbo].[Tasks]
    DROP COLUMN [FirstReview], DROP COLUMN [SecondReview], etc...

然后创建一个名为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)

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