如何将新行添加到具有多列作为主键的 SQL 服务器 table

How to add new row to SQL Server table that has multiple columns as primary key

我在 SQL 服务器中有一个多对多关系 table。

Table: 申请

Table: AppCategory

Table: AppPerCategory

[AppPerCategory] 中的主键是 CategoryID + AppID

[Application][AppPerCategory] 中的主键不在 sequence/order 中。

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

我正在构建一个小型 C# ASP.NET Web 表单以允许用户向 [Application] table.

添加新行

table 设计有点奇怪。理想情况下,ApplicationID 应该是一个标识列,以便 SQL 服务器将为您 auto-increment。但是,嘿,我们都处理遗留系统,其中某些部分是我们无法控制的。

请参阅下文 SQL fiddle 了解一种执行此操作的方法。显然,当你有超过 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)