-2

我有權訪問數據庫並希望使用Visual Studio 2015 SQL工具將其複製到本地PC(使用模式和數據)。SQL Server:現有數據的外鍵問題

我複製架構,數據庫有2個表:MenusMenuId是主鍵)和UsersMenuPlansBreakfast是外鍵MenuId,約束有名字FK__UsersMenu__Break__0307610B)。

但是,當我嘗試複製數據,我得到一個錯誤:

Microsoft Visual Studio

The target database could not be updated because of the following error:

.Net SqlClient Data Provider:
Msg 547, Level 16, State 0, Line 37
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__UsersMenu__Break__0307610B". The conflict occurred in database "MealGenius", table "dbo.Menus", column 'MenuId'.

Last executed command: DECLARE @pv binary(16)

INSERT INTO [dbo].[UsersMenuPlans] ([UserMenuPlanId], [UserId], [Date], [Breakfast], [MidMorningSnack], [Lunch], [MidAfternoonSnack], [Dinner], [MidNightSnack], [BreakfastShort], [LunchShort], [DinnerShort], [Dessert], [GreenDrink], [Probiotic], [Snack1Short], [Snack2Short]) VALUES (33522, 59, '20160801 00:00:00.000', 823, 536, 155, 943, 920, 536, NULL, NULL, NULL, NULL, NU (Command was truncated to fit in message box.)

據我瞭解,在UsersMenuPlans一些記錄有值Breakfast,這不Menus表,MenuId列存在,因此SQL工具不能複製它。怎麼可能?本地服務器上

菜單表具有完全相同的數據,遠程服務器上:

enter image description here

遠程服務器是Microsoft SQL Server 2012中 - 11.0.5058.0(X64),局部爲Microsoft SQL Server 2014( SP1-CU7)(KB3162659) - 12.0.4459.0(X64)

Script是:上線上發生

SET NUMERIC_ROUNDABORT OFF 
GO 
SET XACT_ABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON 
GO 

DECLARE @pv binary(16) 
BEGIN TRANSACTION 

ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__Break__0307610B] 
ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__MidMo__03FB8544] 
ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__Lunch__04EFA97D] 
ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__MidAf__05E3CDB6] 
ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__Dinne__06D7F1EF] 
ALTER TABLE [dbo].[UsersMenuPlans] 
     DROP CONSTRAINT [FK__UsersMenu__MidNi__07CC1628] 

SET IDENTITY_INSERT [dbo].[UsersMenuPlans] ON 

INSERT INTO [dbo].[UsersMenuPlans] ([UserMenuPlanId], [UserId], [Date], [Breakfast], [MidMorningSnack], [Lunch], [MidAfternoonSnack], [Dinner], [MidNightSnack], [BreakfastShort], [LunchShort], [DinnerShort], [Dessert], [GreenDrink], [Probiotic], [Snack1Short], [Snack2Short]) 
VALUES (1, 77, '20090407 00:00:00.000', 32, NULL, 13, 82, 15, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) 

INSERT INTO [dbo].[UsersMenuPlans] ([UserMenuPlanId], [UserId], [Date], [Breakfast], [MidMorningSnack], [Lunch], [MidAfternoonSnack], [Dinner], [MidNightSnack], [BreakfastShort], [LunchShort], [DinnerShort], [Dessert], [GreenDrink], [Probiotic], [Snack1Short], [Snack2Short]) 
VALUES (2, 77, '20090408 00:00:00.000', 32, NULL, 13, 82, 15, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) 

INSERT INTO [dbo].[UsersMenuPlans] ([UserMenuPlanId], [UserId], [Date], [Breakfast], [MidMorningSnack], [Lunch], [MidAfternoonSnack], [Dinner], [MidNightSnack], [BreakfastShort], [LunchShort], [DinnerShort], [Dessert], [GreenDrink], [Probiotic], [Snack1Short], [Snack2Short]) 
VALUES (3, 77, '20090409 00:00:00.000', 12, NULL, 15, 82, 13, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) 

... 

SET IDENTITY_INSERT [dbo].[UsersMenuPlans] OFF 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__Break__0307610B] 
     FOREIGN KEY ([Breakfast]) REFERENCES [dbo].[Menus] ([MenuId]) 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__MidMo__03FB8544] 
     FOREIGN KEY ([MidMorningSnack]) REFERENCES [dbo].[Menus] ([MenuId]) 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__Lunch__04EFA97D] 
     FOREIGN KEY ([Lunch]) REFERENCES [dbo].[Menus] ([MenuId]) 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__MidAf__05E3CDB6] 
     FOREIGN KEY ([MidAfternoonSnack]) REFERENCES [dbo].[Menus] ([MenuId]) 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__Dinne__06D7F1EF] 
     FOREIGN KEY ([Dinner]) REFERENCES [dbo].[Menus] ([MenuId]) 

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__MidNi__07CC1628] 
     FOREIGN KEY ([MidNightSnack]) REFERENCES [dbo].[Menus] ([MenuId]) 

COMMIT TRANSACTION 

錯誤:

ALTER TABLE [dbo].[UsersMenuPlans] 
    ADD CONSTRAINT [FK__UsersMenu__Break__0307610B] 
     FOREIGN KEY ([Breakfast]) REFERENCES [dbo].[Menus] ([MenuId]) 

錯誤是:

Msg 547, Level 16, State 0, Line 380
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__UsersMenu__Break__0307610B". The conflict occurred in database "MealGenius", table "dbo.Menus", column 'MenuId'.

ADDED

我已經執行的腳本:

SELECT p.Breakfast, m.MenuId FROM [UsersMenuPlans] p LEFT OUTER JOIN Menus m on p.Breakfast = m.MenuId where m.MenuId is null 

,正如我所料,存在着一些記錄(其中p。早餐是'0'值)。但是如何啓用外鍵可以存在這樣的表?

+0

正在執行什麼ALTER TABLE命令? –

+0

我已將腳本添加到我的問題 –

+0

您是先複製菜單數據然後添加約束?當然 – JamieD77

回答

0

您已經獲得了FK打算執行的UsersMenuPlans表中的數據。

您現有的數據已經違反了FK__UsersMenu__Break__0307610B強加的關鍵約束,因此無法創建約束。這些現有行上的breakfast列很可能是NULL,或者與Menus表中的有效MenuId不匹配。

您需要處理該數據。首先創建約束將無濟於事,因爲問題會因爲約束而成爲數據不會插入的問題。

真正的問題可能是菜單表完全沒有填充,這就解釋了爲什麼參考值不存在。在這種情況下,真正的解決方案是導入菜單表FIRST。

+0

表UsersMenuPlans是空,表格菜單與遠程服務器具有相同的記錄。我只想通過記錄來填充UsersMenuPlans,就像在遠程服務器上一樣。在遠程服務器上沒有NULL「早餐」行,我查了一下。可能它在那裏有無效的MenuId,但它怎麼會是?外鍵存在,但數據無效? –

0

我會建議您只需要備份數據庫並將其恢復到LocalDB實例中。這會少一些痛苦。

如果你想看看這UserMenuPlans行沒有行Menus嘗試像

SELECT * 
FROM UsersMenusPlans P 
LEFT JOIN Menus M ON P.Breakfast = M.MenuId 
WHERE M.MenuId IS NULL 
+0

我瞭解它,確實有些這樣的記錄存在。但是如何啓用外鍵可以存在這樣的表? –