在具有nvarchar索引关系的表上更新/插入时发生冲突

时间:2013-12-21 13:04:30

标签: sql sql-server foreign-keys relationship

我在sql server上有表,如下所示:

:: LG_STATUSES
- code / nvarchar(50)
- name / nvarchar(100)
- description / nvarchar(250)

:: LG_PACKAGES
- LOGICALREF / int
- PersonnelRef / int
- lgStatusCode / nvarchar(50)

// and some other columns which are not related to current problem

状态行表:

code            name            description
------------------------------------------------------------
approved        onaylandı       NULL
draft           taslak          NULL
inApproval      onay sürecinde      NULL

当我使用Microsoft SQL Server Management Studio在这两个表(Statuses.code& Packages.lgStatusCode)之间创建关系时,没有错误。建立关系没有问题。 但是当我尝试通过更改lgStatusCode

来插入新行或更新Packages表上的当前行时
UPDATE [dbo].[LG_PACKAGES]
   SET [lgStatusCode] = 'draft'
 WHERE LOGICALREF = 101

发生如下错误:

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_LG_PACKAGES_LG_STATUSES". The conflict occurred in database "PackageManagement", table "dbo.LG_STATUSES", column 'code'.

我无法弄清楚问题。 “草稿”状态也存在于LG_STATUSES表中。是否因为在关系上使用字符串(nvarchar)而发生错误?这是无效的用法吗?

感谢。

编辑:SQL Contraint定义

ALTER TABLE [dbo].[LG_PACKAGES]  WITH CHECK ADD  CONSTRAINT [FK_LG_PACKAGES_LG_STATUSES] FOREIGN KEY([lgStatusCode])
REFERENCES [dbo].[LG_STATUSES] ([code])
GO

ALTER TABLE [dbo].[LG_PACKAGES] CHECK CONSTRAINT [FK_LG_PACKAGES_LG_STATUSES]
GO

1 个答案:

答案 0 :(得分:1)

LEN(N'draft')应该是5而不是7(见上面的评论)。所以,你很可能在draft字前面有一些空格。

例如,以下语句

SELECT LEN(N'  draft') AS L1, LEN(N'draft') AS L2

返回:

L1          L2
----------- -----------
7           5

以上测试解释了为什么草稿的LEN(代码)是7而不是5.

注意:只有位于字符串末尾的空格是无关紧要的(例如LEN(' draft')= LEN(' draft')= 5; 对于大多数排序规则来说都是如此)。这是符合ANSI SQL标准的行为。

解决方案:删除位于draft状态开头的空白区域。