涉及字符串字段的唯一键

本文关键字:唯一 一键 字段 字符串 | 更新日期: 2023-09-27 18:34:04

我在实现唯一键约束时遇到了一些问题。

它有 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;

命令文本

@"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执行非查询保存数据,并检查myparameter[index]是否包含相应的值,末尾有一个空格。

有什么想法吗?

涉及字符串字段的唯一键

经过一番研究,我发现答案是,虽然您确实发送了两个不同的字符串,但在数据库比较字符串时不考虑尾随空格。包括插入时的独特比较。

因此,要根据需要工作,您必须添加另一个字段,例如字符串的长度,如下所示: 具有唯一字段的MySQL数据库忽略了结束空格