不存在行的SQL递增值
我有一个带有字段的表:UserProjectNumber,这只是一个int字段,需要每次递增一。我目前使用下面的INSERT语句递增这个数字。只要表中已有此用户的记录,此操作就可以正常工作。如果这是第一次运行该语句,它将失败,因为它无法将1添加到NULL不存在行的SQL递增值,sql,sql-server,case,Sql,Sql Server,Case,我有一个带有字段的表:UserProjectNumber,这只是一个int字段,需要每次递增一。我目前使用下面的INSERT语句递增这个数字。只要表中已有此用户的记录,此操作就可以正常工作。如果这是第一次运行该语句,它将失败,因为它无法将1添加到NULL INSERT INTO UserProject (UserID, UserProjectName, UserProjectNumber) VALUES (2, 'Test', CASE WHEN (SELECT MAX(UserProje
INSERT INTO UserProject (UserID, UserProjectName, UserProjectNumber)
VALUES (2, 'Test', CASE WHEN (SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2)= NULL THEN 0 ELSE (SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2)+1 END )
我正在使用MS SQL Server 2012。有人能提出解决这个问题的办法吗?也许以某种方式将空值转换为0
谢谢也许这样可以:
declare @UserProject as Table
( UserProjectId Int Identity, UserId Int, UserProjectName VarChar(32), UserProjectNumber Int );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Test', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Alpha', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 1, 'Aleph', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Beta', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 1, 'Beth', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
select *
from @UserProject
order by UserId, UserProjectNumber;
当允许用户删除项目时,UserProjectNumber
列的维护就会出现问题。这些数字应该保持密集吗?新项目是否应该重用旧数字
如果添加UserProjectNumber
的目的仅仅是为了显示,那么使用Row\u number()over(按UserId按UserProjectName划分)
动态生成一个数字或将其留给应用程序可能更有意义
如果目的是强制每个用户执行六个项目的限制,那么使用
Count()
的约束或触发器可能是更好的选择。给出错误:无法将值NULL插入“UserProjectDeadline”列,表“dbo.UserProject”;列不允许空值。INSERT失败。@请为UserProjectDeadline提供一个值(或添加一个默认约束)。请注意,它不是已指定的字段之一。@user2246674它已具有默认约束1,但我正在通过asp.net插入记录,因此需要分离我试图避免的语句。是否存在使用IDENTITY
列不可接受的原因?@HABO-仍然给出有关插入NULL的相同错误价值标识列是此表的主键。用户只能有6个项目-编号1到编号6-在这种情况下,身份号码将不可行,因为它可能有数百万。ROW_Number()正是我所寻找的-我甚至不知道它的存在!谢谢
declare @UserProject as Table
( UserProjectId Int Identity, UserId Int, UserProjectName VarChar(32), UserProjectNumber Int );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Test', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Alpha', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 1, 'Aleph', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 2, 'Beta', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
( 1, 'Beth', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
select *
from @UserProject
order by UserId, UserProjectNumber;