-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

我了解它,确实有些这样的记录存在。但是如何启用外键可以存在这样的表? –