【问题标题】:MERGE statement conflicts with foreign key constraintMERGE 语句与外键约束冲突
【发布时间】:2018-07-26 14:32:18
【问题描述】:

我有两张桌子。 STCH 与 SSBT 是一对多的。 STCH 中的 TN 是 SSBT 中的外键。 SSBT 是 TN 的分配列表。我想保持 STCH(员工名单)的更新,并正在使用 MERGE 语句。

STCH = TN(ID#), TE(name),SID(StaffID),HSE(Department),DTS(datetime stamp=today)

SSBT = DATE(of assignment),TN(foreign key),PID(assignment #),SITE(bldg),DTS(datetime-today)

MERGE 语句从另一个数据库中的类似表中提取数据,并在 assignments 数据库中填充我的 STCH 表:

MERGE STCH T
USING (SELECT TN,TE,TCH.ID,U1 FROM DST17000FUHSD.DBO.TCH 
JOIN DST17000FUHSD.DBO.STJ j on j.id = DST17000FUHSD.DBO.TCH.id 
and (j.scl = 1 or j.scl = 0)
WHERE tch.SC = 1 AND TN > 1 AND DST17000FUHSD.DBO.TCH.ID > 1 and tg = '' and 
j.jc = 12 and DST17000FUHSD.DBO.TCH.del = 0 ) S
ON (S.TN = T.TN and s.id = t.sid)
WHEN MATCHED
 THEN UPDATE
  SET    T.TE = S.TE,
        T.SID = S.ID,
        T.HSE = S.U1

WHEN NOT MATCHED BY TARGET 
   THEN INSERT (TN,TE,SID,HSE)
   VALUES (S.TN,S.TE,S.ID,S.U1)
WHEN NOT MATCHED BY SOURCE 
THEN DELETE;

这是我的错误信息

消息 547,级别 16,状态 0,第 1 行 MERGE 语句与 REFERENCE 约束“FK_87”。数据库发生冲突 “SUBMAN”,表“dbo.SSBT”,列“TN”。该声明已 终止。

当我自己运行子查询时,我得到了正确的数据。 TN,TE,ID,U1

这是外键

USE [SUBMAN]
GO

ALTER TABLE [dbo].[SSBT]  WITH CHECK ADD  CONSTRAINT [FK_87] FOREIGN 
KEY([TN])
REFERENCES [dbo].[STCH] ([TN])
GO

ALTER TABLE [dbo].[SSBT] CHECK CONSTRAINT [FK_87]
GO

【问题讨论】:

  • 哪个 dbms?????
  • 对不起。 SQL 2012 - 管理工作室
  • 所以在你的问题中添加 SQL Server 标签。

标签: sql sql-server merge foreign-keys conflict


【解决方案1】:

这意味着您正在删除的数据(由您的WHEN NOT MATCHED BY SOURCE THEN DELETE;)在您的另一个表中被引用。 如果您不想删除不在 Source 子查询中的数据,请删除该部分查询。

【讨论】:

  • 就是这样。虽然当我在没有“删除”部分的情况下运行它时,我收到了错误消息 8672,级别 16,状态 1,第 1 行 MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。 MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。我通过分组解决了这个问题,它没有运行错误
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2018-10-12
  • 2019-02-16
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多