【问题标题】:SQL adding an int field, and incrementing other fields based on that number in the same columnSQL 添加一个 int 字段,并根据同一列中的该数字递增其他字段
【发布时间】:2021-02-04 22:15:24
【问题描述】:

我需要一些SQL设计思维的灵感,我刚刚开始学习SQL。我的知识非常有限,所以请多多包涵。。

我有一个测验应用程序,在 SQL 中,我有一整行,对应于每个测验问题和答案。它非常基础,而且设计得不是很好。但是这里有。

像这样..

我的要求是让用户能够在测验列表中的任何位置添加问题。例如,如果用户想在第 2 处添加新问题,则用户可以点击在位置 2 处添加问题,这会将新记录添加到数据库中并刷新页面以查看问题已重新排序和编号..

我的应用程序根据类别拉回数据。例如,如果用户想要查看我的应用程序中的历史类别。他们点击一个按钮,他们会看到标题列表和下面的按钮..

如您所见.. 我的桌子没有为此做好准备.. 谁能给我一些提示,告诉我如何在数据库中实现这一点。

非常感谢。

【问题讨论】:

  • 只是提出一个想法。您可以使用问题的 id 和 InOrder 列创建另一个表。添加新问题时,您可以更新其他问题的 InOrder 值。之后,您可以通过加入问题表和排序表来排序问题,并将 InOrder 列用作排序列。
  • 这里的实际问题是什么?订购问题?呈现连续的序数(但可能是任意顺序)?或者知道按下按钮时要删除/更改哪个问题/无论什么?
  • 而且(我从某个地方知道,您昨天是否发布了有关该架构的内容?)您可能想要修改架构,而不是答案的列,您可以制作一个额外的一行表格每个答案。
  • 谢谢大家的建议
  • @MonkeyDLuffy,我觉得这是正确的方法,我只是不知道如何根据添加到 questionId 的新 InOrder 值更新其他字段。你有例子吗?

标签: c# sql sql-server blazor


【解决方案1】:

您想要一个用于 ids 的链接列表和该类别的外部表(粘性位已经处理了这个)。

在插入新行时,使用了一个存储过程,它执行以下操作:

update QuizTable set position = position + 1 where position >= 2;
insert into QuizTable(position, question) values (2, "new question");

如果您的表需要并发更新,那么这当然行不通!! (因为如果一个用户在您更新位置 2 时更新位置 8,您可能会被锁定。

为多用户系统安全地执行此操作的唯一方法是实现下一个/前列(或将它们放在单独的数据库表中)。这个选项是一项艰巨的任务,你应该避免它。

您的插入存储过程如下所示:

declare @myNewId = 94;
declare @position2Id = 50;
insert into QuizTable(id, question)
values (@myNewId, "my new question");

declare @next, @prior
select @next = next, @prior = prior from QuizTable where id = @myNewId;

update QuizTable set next = @myNewId where id = prior;
update QuizTable set prior = @myNewId where id = @position2Id

然后您的列表将由动态计算的 id 和自引用的表扫描组成,其中 id 1 = 之前的 IS NULL id 2 = id1.next

刚刚为您找到了这个链接: Linked List in SQL

【讨论】:

  • 抱歉,对于新手来说这看起来真的很复杂,你能简单地解释一下这些查询中发生了什么。谢谢
  • 谢谢大家的帮助,我已经关注了链表链接,它的工作,谢谢大家的帮助
【解决方案2】:

一种可能的解决方案是为问题创建一个表格。一个用于类别。

CREATE TABLE question
             (id integer,
              question varchar(64),
              PRIMARY KEY (id));

CREATE TABLE category
             (id integer,
              name varchar(64),
              PRIMARY KEY (id));

然后是一个表格,该表格将问题链接到类别,并带有一个序号,该序号指定问题在类别中的位置。这也具有一个问题可以属于多个类别的魅力。

CREATE TABLE category_question
             (category integer,
              question integer,
              ordinal integer,
              PRIMARY KEY (category,
                           question),
              FOREIGN KEY (category)
                          REFERENCES category
                                     (id),
              FOREIGN KEY (question)
                          REFERENCES question
                                     (id));

而且,正如我已经建议的那样,还有一个额外的答案表,还有一个序数。

CREATE TABLE answer
             (id integer,
              question integer,
              answer varchar(64),
              ordinal integer,
              PRIMARY KEY (id),
              FOREIGN KEY (answer)
                          REFERENCES question
                                     (id));

每当移动问题(或答案)时,您都可以相应地更改序数。出于展示目的,您可以通过它订购。

【讨论】:

  • 感谢您的演示,如果可能的话,您能否提供任何用于插入和获取数据的 SP。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2020-10-14
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多