MERGE 语句与外键约束冲突
MERGE statement conflicts with foreign key constraint
我有两个 table。 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 语句从另一个数据库中的类似 table 中提取数据,并在分配数据库中填充我的 STCH table:
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 The MERGE statement conflicted with
the REFERENCE constraint "FK_87". The conflict occurred in database
"SUBMAN", table "dbo.SSBT", column 'TN'. The statement has been
terminated.
当我 运行 子查询本身时,我得到了正确的数据。 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
这意味着您正在删除的数据(通过您的 WHEN NOT MATCHED BY SOURCE THEN DELETE;
)在您的另一个 table 上被引用。
如果您不想删除不在 Source
子查询中的数据,请删除该部分查询。
我有两个 table。 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 语句从另一个数据库中的类似 table 中提取数据,并在分配数据库中填充我的 STCH table:
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 The MERGE statement conflicted with the REFERENCE constraint "FK_87". The conflict occurred in database "SUBMAN", table "dbo.SSBT", column 'TN'. The statement has been terminated.
当我 运行 子查询本身时,我得到了正确的数据。 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
这意味着您正在删除的数据(通过您的 WHEN NOT MATCHED BY SOURCE THEN DELETE;
)在您的另一个 table 上被引用。
如果您不想删除不在 Source
子查询中的数据,请删除该部分查询。