sql - 合并引发外键冲突

标签 sql sql-server

这是我的 SQL 语句的一部分:

MERGE INTO Scyk.dbo.Threads AS d
USING (SELECT Id,Question,QuestionTitle, Answer, Category FROM Homework.dbo.Zadanes) AS s
ON 1 = 2 
   WHEN NOT MATCHED THEN
      INSERT (CurrentValue, NumberOfPosts, TotalValue, Views, Title, DateCreated, LastPostAuthor, LastPostDateTime, IsDeleted, Restricted, RestrictWrite, Sticked, CategoryName, AuthorUserName)
      VALUES (0, 2, 0, 0, s.QuestionTitle, CURRENT_TIMESTAMP, 'zadania', DATEADD(second, 1, CURRENT_TIMESTAMP), 0, 0, 0, 0, s.Category, 'zadania')

这是我得到的错误:

The MERGE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Threads_dbo.Categories_CategoryName". The conflict occurred in database "Scyk", table "dbo.Categories", column 'Name'.

所以我做的第一件事是检查外键完整性:

SELECT Distinct(Category) FROM [Homework].[dbo].[Zadanes]
where not exists
(select distinct(Name) from Scyk.dbo.Categories)

但是这没有返回任何内容,这意味着外键是好的。那么这里发生了什么?

最佳答案

您应该停止使用MERGE,恕我直言,而只使用普通的INSERTMERGE 给您带来了什么?

在部分或所有受支持的 SQL Server 版本中,至少有 15 个错误尚未修复:

听起来像this is the one causing your issue ,并且它已被关闭为“无法修复”。 last one may resolve your issue (get the fix from KB #956718),但不知何故我对此表示怀疑。即使确实如此,那么您也可能会受到其中列出的其他 14 个因素之一(或另一个尚未发现的因素)的影响。可悲的是,这是一个只经过最少测试就发布了半成品功能,然后在 3 个以上版本中忽略它的情况。

如果您想检查外键,您的查询可能应如下所示:

SELECT Distinct(Category) FROM [Homework].[dbo].[Zadanes] AS z
where not exists
(select 1 from Scyk.dbo.Categories AS c WHERE c.name = z.Category);

尽管奇怪的是,您的名称上有一个外键,而不是一个 CategoryID。名称更改后会发生什么?您是否设置了级联选项?在 Zadanes 的每一行中重复 'Electronics' 或更长的类别名称会浪费多少空间?

关于sql - 合并引发外键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19819139/

相关文章:

sql-server - Testcafe - 如何在所有装置运行后运行代码

mysql - 如果行两次匹配 IF 条件,则选择该行两次

java - 如何将 INTEGER/NULL 绑定(bind)到 ? Android 中带有 rawQuery SelectionArgs 的占位符?

SQL 搜索所有字段

mysql - 1452 - 无法添加或更新子行 : a foreign key constraint fails

sql - 选择最高聚合组

java - 连接两个表以获得完整记录

SQL Server - 事务在错误时回滚?

sql-server - SSIS:无法创建 OLE DB 访问器。验证列元数据是否有效

json - OPENJSON 中的动态透视