SQL Server 2008 插入失败报告
SQL Server 2008 Insert fails reporting
我对用户名和昵称字段都有独特的限制。当我 运行 以下代码带有重复的昵称时, SQL Server 2008 报告错误 23000 违反唯一键约束。但是当我 运行 它使用重复的用户名时,不会抛出任何错误(尽管消息 "Affected Rows: 0" 结果并且没有对 table 进行任何更改)。
我不明白为什么会这样或如何处理(我希望在任何一种情况下都抛出错误)。提前致谢。
INSERT INTO 成员(用户名、昵称)
值('bob'、'bob55')
CREATE TABLE [Members].[Members] (
[GUID] uniqueidentifier NOT NULL DEFAULT (newsequentialid()) ,
[UserName] nvarchar(256) NOT NULL ,
[NickName] nvarchar(256) NOT NULL ,
)
-- ----------------------------
-- Indexes structure for table Members
-- ----------------------------
CREATE UNIQUE INDEX [Index:UserName] ON [Members].[Members]
([UserName] ASC)
WITH (IGNORE_DUP_KEY = ON)
GO
-- ----------------------------
-- Primary Key structure for table Members
-- ----------------------------
ALTER TABLE [Members].[Members] ADD PRIMARY KEY ([GUID])
GO
-- ----------------------------
-- Uniques structure for table Members
-- ----------------------------
ALTER TABLE [Members].[Members] ADD UNIQUE ([NickName] ASC)
GO
ALTER TABLE [Members].[Members] ADD UNIQUE ([UserName] ASC)
GO
在SQL服务器中有两种方法可以使字段唯一:
- 唯一约束
- 唯一索引
创建唯一索引时,可以设置数据库行为以防尝试插入重复值:
WITH (IGNORE_DUP_KEY = ON)
- 什么都不做,忽略具有重复值的新记录
WITH (IGNORE_DUP_KEY = OFF)
- 抛出异常
创建唯一约束时,SQL服务器以隐式方式创建唯一索引WITH (IGNORE_DUP_KEY = OFF)
在您的问题中,您创建了 3 个唯一索引:一个在 UserName 列上显式索引,两个在 NickName 和 UserName 字段上隐式索引。当您尝试插入具有重复用户名的记录时,插入会因违反唯一索引而停止,并且 SQL 服务器会忽略该记录。没有针对唯一约束的工作。但是,当您尝试插入具有重复 NickName 的记录时,唯一约束会产生错误。
如果您想以相同的方式获取两个字段的错误,只需删除唯一索引:
DROP INDEX [Index:UserName] ON [Members].[Members]
我对用户名和昵称字段都有独特的限制。当我 运行 以下代码带有重复的昵称时, SQL Server 2008 报告错误 23000 违反唯一键约束。但是当我 运行 它使用重复的用户名时,不会抛出任何错误(尽管消息 "Affected Rows: 0" 结果并且没有对 table 进行任何更改)。
我不明白为什么会这样或如何处理(我希望在任何一种情况下都抛出错误)。提前致谢。
INSERT INTO 成员(用户名、昵称) 值('bob'、'bob55')
CREATE TABLE [Members].[Members] (
[GUID] uniqueidentifier NOT NULL DEFAULT (newsequentialid()) ,
[UserName] nvarchar(256) NOT NULL ,
[NickName] nvarchar(256) NOT NULL ,
)
-- ----------------------------
-- Indexes structure for table Members
-- ----------------------------
CREATE UNIQUE INDEX [Index:UserName] ON [Members].[Members]
([UserName] ASC)
WITH (IGNORE_DUP_KEY = ON)
GO
-- ----------------------------
-- Primary Key structure for table Members
-- ----------------------------
ALTER TABLE [Members].[Members] ADD PRIMARY KEY ([GUID])
GO
-- ----------------------------
-- Uniques structure for table Members
-- ----------------------------
ALTER TABLE [Members].[Members] ADD UNIQUE ([NickName] ASC)
GO
ALTER TABLE [Members].[Members] ADD UNIQUE ([UserName] ASC)
GO
在SQL服务器中有两种方法可以使字段唯一:
- 唯一约束
- 唯一索引
创建唯一索引时,可以设置数据库行为以防尝试插入重复值:
WITH (IGNORE_DUP_KEY = ON)
- 什么都不做,忽略具有重复值的新记录WITH (IGNORE_DUP_KEY = OFF)
- 抛出异常
创建唯一约束时,SQL服务器以隐式方式创建唯一索引WITH (IGNORE_DUP_KEY = OFF)
在您的问题中,您创建了 3 个唯一索引:一个在 UserName 列上显式索引,两个在 NickName 和 UserName 字段上隐式索引。当您尝试插入具有重复用户名的记录时,插入会因违反唯一索引而停止,并且 SQL 服务器会忽略该记录。没有针对唯一约束的工作。但是,当您尝试插入具有重复 NickName 的记录时,唯一约束会产生错误。
如果您想以相同的方式获取两个字段的错误,只需删除唯一索引:
DROP INDEX [Index:UserName] ON [Members].[Members]