2016-09-19 230 views
-1

我收到以下錯誤,同時做一個插入到另一個表(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' 
+2

您試圖插入不存在父記錄的子記錄。基本上就是這樣。但是由於你沒有提供有用的細節(如示例查詢/數據),這只是一個猜測。 –

+0

我編輯了更多信息的帖子,希望有所幫助。 – WadeU

+0

更好。但是相關字段和FK的表格定義也會非常有用。 –

回答

0

您的查詢嘗試在ApplicationTasks表中插入不存在的applicationid。

例子:

假設你dbo.Application表中有如下數據:

applicationid - description - data 
    1  - test   - 09192016 
    2  - test2  - 09192016 
    3  - test3  - 09192016 

如果您嘗試插入並在ApplicationTasks表的applicationID在4個或更多,你會得到這樣的錯誤,因爲你打破了這種關係。

+0

雖然這是事,但我試圖插入ApplicationTasks的applicationid存在於應用程序表中。這是令人困惑的部分。 – WadeU

+0

你能發佈更多關於你的數據庫的信息嗎?該關係的細節,插入的數據等? – Stormhashe

+0

剛剛編輯帖子。 – WadeU

相關問題