在SQL SERVER 2005中设置标识列的最大值

时间:2009-09-21 16:33:32

标签: sql-server-2005

我正在开发Windows应用程序(使用Visual Studio 2008,Sql server 2005)。我必须维护用户日志信息。我有一个标识栏。它工作正常。但是现在identity列的值是172.再次当我尝试登录时,我收到错误:

违反主键pk_userLogId无法在object'dbo.UserLog'中插入重复值。 声明已经终止。

当我关闭错误对话框时,我仍然可以使用该应用程序但是没有维护用户日志。

我应该怎么做以避免收到此错误消息?

我有什么方法可以设置标识列的最大值吗?

请帮帮我! 提前谢谢!

2 个答案:

答案 0 :(得分:0)

您是否已将自己的标识列设置为自动增量。它听起来不像数字范围问题。相反,在创建新的UserLog条目时,您似乎明确提供了主键值。错误消息让我相信表UserLog中已存在一条记录,其中包含您尝试添加的相同主键值。

答案 1 :(得分:0)

修改

我最初的回答是错误的,因为它是基于对日志表架构的误解。鉴于Sheetal后来发布了这个模式(我意识到列的名称是UserLogId,而不是UserLoginID ......),这个假设无效。

因此,日志表是

CREATE TABLE USERLOG 
( UserLogId int identity (1,1) CONSTRAINT pk_UserLogId primary key, 
  UserName nvarchar(50) not null, 
  LogInTime datetime CONSTRAINT dft_LogInTime default getdate() 
) 
--ADDING LOGOUT TIME ALTER TABLE USERLOG ADD LogOutTime datetime

让OP问题更令人费解......

如何通过标识列获取PK违规条件?  (除非该表的INDENTITY_INSERT设置,以及包含PK列值的手动编辑/插入,也许Sheetal可以解释一下......?)

因此,Sheetal应该在用户通过身份验证之后,在完成登录的代码区域中查看应用程序的逻辑,并查找为UserLogId列指定值的查询实例(WHERE子句除外) ,当然)。

顺便说一句,我不确定为什么我们都这么努力?鉴于Sheetal自己设定问题的最小努力,即使考虑到可能存在英语语言障碍,并提供信息...... 当然是他的录取率...... ;-)

- 以下是错误的(基于错误的假设)----

问题似乎是 UserLoginId 被声明为日志表的主键。对于这样的表,这是一个奇怪的选择,因为我们希望给定用户有许多日志记录。

在SQL表中,主键约束实质上指示SQL拒绝对具有表中容易存在的主键值的记录的任何INSERT请求。 (并返回类似于问题中提到的错误条件)

很难建议不知道日志表架构和用例,但您可以完全删除pk约束或使用其他列。名为“EventId”的自动递增列可能是一个很好的选择。你会在日志表中得到类似的东西:

EventID (PK)   DateTime              UserLoginId  EventType     Details
1              01/02/2008 06:15:01   172          LogIn         Stan
2              01/02/2008 06:15:21   321          LogIn         Jeff
3              01/02/2008 06:15:24   172          FileDownload  Report7.pdf
4              01/02/2008 06:15:54   172          FileDownload  SalesTraining.pdf
5              01/02/2008 06:17:21   321          LogOut        

等...