C# SQL添加一个int字段,并基于同一列中的该数字递增其他字段

C# SQL添加一个int字段,并基于同一列中的该数字递增其他字段,c#,sql,sql-server,blazor,C#,Sql,Sql Server,Blazor,我需要一些SQL设计思想的灵感,我刚刚开始学习SQL。我的知识很有限,所以请容忍我 我有一个测验应用程序,在SQL中,我有一整行,对应于每个测验问题和答案。它是非常基本的,设计得不是很好。但事情是这样的 就这样 我的要求是让用户能够在测验列表的任何位置添加问题。例如,如果用户想在第2位添加新问题,用户可以单击位置2的添加问题,这将向数据库中添加新记录并刷新页面,以查看问题是否已重新排序和编号 我的应用程序根据类别收回数据。。例如,如果用户想在我的应用程序中查看历史记录类别。他们点击一个按钮,就

我需要一些SQL设计思想的灵感,我刚刚开始学习SQL。我的知识很有限,所以请容忍我

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

就这样

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

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

如你所见。。我的桌子就是没准备好。。有谁能给我一些建议,关于我如何在DB内实现这一点


非常感谢。

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

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));

无论何时移动问题(或答案),都可以相应地更改序号。出于显示目的,您可以按它排序。

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

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));

无论何时移动问题(或答案),都可以相应地更改序号。出于显示目的,您可以按它排序。

您需要ID的链表和类别的外部表(粘性位已经处理过了)

插入新行时,使用的存储过程如下所示:

update QuizTable set position = position + 1 where position >= 2;
insert into QuizTable(position, question) values (2, "new question");
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
如果您的表需要并发更新,那么这当然不起作用!!(因为如果一个用户在更新位置2的同时更新位置8,您可能会被锁定

对于多用户系统,安全地执行此操作的唯一方法是实现下一列/上一列(或将它们放在单独的数据库表中)。此选项是一项困难的任务,您可能应该避免它

您的insert存储过程如下所示:

update QuizTable set position = position + 1 where position >= 2;
insert into QuizTable(position, question) values (2, "new question");
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=Previor为空 ID2=id1.next

刚刚为您找到此链接:

您需要ID的链表和类别的外部表(粘性位已经处理过了)

插入新行时,使用的存储过程如下所示:

update QuizTable set position = position + 1 where position >= 2;
insert into QuizTable(position, question) values (2, "new question");
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
如果您的表需要同时更新,那么这当然不起作用!!(因为如果一个用户在更新位置2的同时更新位置8,您可能会被锁定

对于多用户系统,安全地执行此操作的唯一方法是实现下一列/上一列(或将它们放在单独的数据库表中)。此选项是一项困难的任务,您可能应该避免它

您的insert存储过程如下所示:

update QuizTable set position = position + 1 where position >= 2;
insert into QuizTable(position, question) values (2, "new question");
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=Previor为空 ID2=id1.next

刚刚为您找到此链接:

只是提出一个想法。您可以创建另一个带有问题id和索引列的表。添加新问题时,您可以更新其他问题的索引值。之后,您可以通过将问题表和索引表合并并使用索引列作为排序列来排序问题。这里的实际问题是什么?排序这些问题?呈现连续的序号(但可能是任意顺序)?或者知道当按下按钮时要删除/更改哪个问题/无论什么?还有(我从某处知道,你昨天有没有发布关于该模式的内容?)您可能需要修改模式,而不是答案的列,您可以创建一个额外的表,每个答案一行。谢谢您的建议guys@MonkeyDLuffy,我觉得这是正确的方法,我只是不知道如何根据添加到questionId的新的顺序值来更新其他字段。你有一个例子吗?仅此而已我有一个想法。你可以创建另一个带有问题id和索引列的表。当你添加一个新问题时,你可以更新其他问题的索引值。之后,你可以通过连接问题表和索引表来排序问题,并使用索引列作为排序列。这里的实际问题是什么?排序问题ns?显示连续的序号(但可能是任意顺序)?或者知道当按下按钮时要删除/更改/什么问题?而且(我从某处知道,你昨天有没有发布关于该模式的内容?)您可能需要修改模式,而不是答案的列,您可以创建一个额外的表,每个答案一行。谢谢您的建议guys@MonkeyDLuffy,我觉得这是正确的方法,我只是不知道如何根据添加到questionId的新的顺序值更新其他字段。你有一个例子吗?对不起,t对于一个新手来说,这看起来真的很复杂,你能简单地解释一下,在这些问题中发生了什么吗?谢谢你们谢谢你们的帮助,我已经跟进了