我正在开发一个Windows应用程序(使用Visual Studio 2008,Sql server 2005)。我必须维护用户日志信息。我有一个身份栏。它运行良好。但现在标识列的值是 172。当我尝试登录时,我再次收到错误:
违反主键 pk_userLogId 无法在对象“dbo.UserLog”中插入重复值。 该声明已终止。
当我关闭错误对话框时,我仍然可以使用该应用程序,但不会维护用户日志。
我应该怎样做才能避免收到此错误消息?
有什么方法可以设置标识列的最大值吗?
请帮帮我! 预先感谢!
我最初的回答是错误的,因为它是基于对日志表模式的误解。鉴于 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 子句中的除外)当然)。
-- 以下是错误的(基于错误的假设)----
问题似乎是 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
等等...
您是否将标识列设置为自动增量。这听起来不像是数字范围问题。相反,您似乎在创建新的 UserLog 条目时显式提供了主键值。该错误消息使我相信表 UserLog 中已存在一条记录,其主键值与您尝试添加的主键值相同。