如何将新行添加到具有多个列作为主键的SQL Server表

时间:2018-04-10 03:05:23

标签: c# asp.net sql-server aspxgridview

我在SQL Server中有一个多对多的关系表。

表:申请

Application

表: AppCategory

AppCategory

表: AppPerCategory

AppPerCategory

[AppPerCategory]中的主键是CategoryID + AppID

[Application][AppPerCategory]中的主键不按顺序排列。

那么,如何使用C#,ASP.NET WebForms向[Application]添加新行?

我正在构建一个小型的C#ASP.NET Web表单,以允许用户向[Application]表添加新行。

1 个答案:

答案 0 :(得分:0)

桌子设计有点奇怪。理想情况下,ApplicationID应该是一个标识列,以便SQL服务器为您自动增加它。但是,嘿,我们都处理遗留系统,其中一些部分是我们无法控制的。

请参阅下面的SQL小提琴,了解一种方法。显然,当你有超过999个应用程序时,它会崩溃,所以你必须处理这个问题:

SQL Fiddle

MS SQL Server 2017架构设置

CREATE TABLE Application (Id varchar(3), ApplicationName varchar(max))
CREATE TABLE AppCategory (Id varchar(2), CategoryName nvarchar(max))
CREATE TABLE AppPerCategory (CategoryId varchar(2), ApplicationId varchar(3), SeqIndex int)


INSERT Application VALUES ('091', 'foo')
INSERT AppCategory VALUES ('00', 'test category')
INSERT AppPerCategory VALUES ('00', '091', 1)

查询1

-- Assume below two are inputs for creating new application
DECLARE @newAppName varchar(max) = 'new application'
DECLARE @category varchar(max) = 'test category'

-- Below will set newAppId to 092. Not you have to adjust for when # apps > 999
DECLARE @newAppId varchar(3) = (SELECT REPLACE(STR(CAST(MAX(Id) AS int) + 1, 3), ' ', 0) FROM Application)
DECLARE @categoryId varchar(2) = (SELECT Id from AppCategory WHERE CategoryName = @category)

DECLARE @newCategorySeqIndex int = (SELECT MAX(SeqIndex) + 1 FROM AppPerCategory WHERE CategoryId = @categoryId)

INSERT Application (Id, ApplicationName)
  VALUES (@newAppId, @newAppName)

INSERT AppPerCategory (CategoryId, ApplicationId, SeqIndex)
  VALUES (@categoryId, @newAppId, @newCategorySeqIndex)