我收到以下錯誤,同時做一個插入到另一個表(ApplicationTasks
)這FK:INSERT語句衝突與外鍵約束
INSERT語句衝突與外鍵約束 「FK_ApplicationTasks_Application__ApplicationId 」。衝突 發生在數據庫「狀態」,表「dbo.Application」,列 'ApplicationId'。
這種情況一直髮生,但我們仍然有記錄被插入到ApplicationTasks
表中。插入可以每秒多次。我不認爲會有任何形式的阻塞\鎖定會導致這種情況。它引用的ApplicationId
已存在於Application
表中。
任何想法可以指導我解決這個問題嗎?
編輯:我還不能將圖片添加到我的職位,所以在這裏我可以查詢\數據做到最好:
申請表:
SELECT [ApplicationId]
,[ApplicationName]
FROM [Status].[dbo].[Application]
WHERE ApplicationId = 498
結果:
ApplicationId ApplicationName
498 Tst ESB PowerEnterprise.PO.MG
ApplicationTasks表:
SELECT TOP 10 [TaskId]
,[Task]
,[ApplicationId]
,[RunTime]
FROM [Status].[dbo].[ApplicationTasks]
WHERE ApplicationId = 498
結果:
TaskId Task ApplicationId RunTime
769893930 Dummy Task 498 2016-04-25 07:45:21.080
769894958 Dummy Task 498 2016-04-25 08:30:10.857
769895327 Dummy Task 498 2016-04-25 08:45:15.517
769895328 Dummy Task 498 2016-04-25 08:45:16.063
769896677 Dummy Task 498 2016-04-25 09:45:13.427
769896678 Dummy Task 498 2016-04-25 09:45:13.473
769897019 Dummy Task 498 2016-04-25 10:00:17.103
769897020 Dummy Task 498 2016-04-25 10:00:17.743
769897356 Dummy Task 498 2016-04-25 10:15:19.423
769897703 Dummy Task 498 2016-04-25 10:30:13.023
正如你所看到的,498的applicationID是在應用程序表,還有已經插入ApplcationTasks表本的applicationID記錄。但它仍然會拋出這個錯誤。難道是因爲它運行頻繁嗎?
再次編輯:
FK上ApplicationTasks
ALTER TABLE [dbo].[ApplicationTasks] WITH CHECK ADD CONSTRAINT [FK_ApplicationTasks_Application__ApplicationId] FOREIGN KEY([ApplicationId])
REFERENCES [dbo].[Application] ([ApplicationId])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ApplicationTasks] CHECK CONSTRAINT [FK_ApplicationTasks_Application__ApplicationId]
GO
存儲過程由代碼調用:
ALTER Procedure [dbo].[sp_applicationtasks_insert](
@applicationkey INT,
@task VARCHAR(40),
@userid VARCHAR(40),
@runtime DATETIME,
@taskstatus VARCHAR(20),
@detail VARCHAR(500),
@applicationstate VARCHAR(20),
@host VARCHAR(40)
)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO [applicationtasks]
(
[ApplicationId],
[Task],
[UserId],
[RunTime],
[Status],
[Detail],
[ApplicationState],
[Host]
) VALUES (
@applicationkey,
@task,
@userid,
@runtime,
@taskstatus,
@detail,
@applicationstate,
@host
)
COMMIT TRANSACTION
RETURN @@Identity
END
實施例聲明失敗週期性:
EXECUTE @RC = [dbo].[sp_applicationtasks_insert]
@applicationkey = 498
,@task = "Dummy Task"
,@userid = ''
,@runtime = getdate()
,@taskstatus = ''
,@detail = ''
,@applicationstate = ''
,@host = 'SERVERNAME'
您試圖插入不存在父記錄的子記錄。基本上就是這樣。但是由於你沒有提供有用的細節(如示例查詢/數據),這只是一個猜測。 –
我編輯了更多信息的帖子,希望有所幫助。 – WadeU
更好。但是相關字段和FK的表格定義也會非常有用。 –