我在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
答案 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
状态开头的空白区域。