MERGE语句与外键约束冲突

时间:2018-02-15 18:23:36

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

我有两张桌子。 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语句从另一个数据库中的类似表中提取数据,并在赋值数据库中填充我的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;

这是我的错误消息

  

Msg 547,Level 16,State 0,Line 1 MERGE语句与之冲突   REFERENCE约束" FK_87"。冲突发生在数据库中   " SUBMAN",table" dbo.SSBT",column' 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

1 个答案:

答案 0 :(得分:2)

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