我遇到了对唯一键的约束实现的一些问题。
它有3个字段,其中一个是字符串。问题是当我发送这两行时,我违反了唯一键:
DB
First: Id-type int
Second: PosId-type uniqueidentifier
Third: Description-type nvarchar(256)
定义约束
ALTER TABLE dbo.StAPSachverhalte ADD CONSTRAINT
UQ_myuniqueKey UNIQUE NONCLUSTERED
(
CompanyId,
PosId,
Description
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
C#参数代码
new SqlParameter("@Description", SqlDbType.NVarChar, 256),
new SqlParameter("@PosId", SqlDbType.UniqueIdentifier),
...
MyParameters1[0].Value = _newData.Description;
MyParameters1[1].Value = _newData.PosId;
的CommandText
@"INSERT INTO StAPSachverhalte(
[Description],
[PosId]
)
VALUES (
@Description,
@PosId)
SET @ID = SCOPE_IDENTITY()",
已发送条目
'1, random GUID, 001'
'1, random GUID, 001 '
如果我没有错,两者都应该有效,因为'001'<> '001'。
错误
Cannot insert duplicate key in object 'dbo.XXX'. The duplicate key value is (76, 9bcba4e1-4d16-487c-977f-cda933bb0955, 0001 ).
我尝试使用参数来使用正常的sqlcommand executiontenonquery保存数据,并检查myparameter [index]是否包含相应的值,末尾有空格。
有什么想法吗?
答案 0 :(得分:3)
经过一些研究,我发现答案是,当你确实发送两个不同的字符串时,DB比较字符串时不会考虑尾随空格。插入时包括唯一比较。
因此,要按照您的意愿工作,您必须按照此处的建议添加另一个字段,例如字符串的长度:MySQL database with unique fields ignored ending spaces