SQL Server:现有数据的外键问题

时间:2016-08-03 19:16:57

标签: sql-server database visual-studio visual-studio-2015 sql-server-2012

我可以访问数据库,并希望使用Visual Studio 2015 SQL工具将其复制到我的本地PC(使用架构和数据)。

我复制了模式,数据库有2个表:MenusMenuId是主键)和UsersMenuPlansBreakfastMenuId的外键,约束的名称为FK__UsersMenu__Break__0307610B)。

但是当我尝试复制数据时,我收到一个错误:

  

Microsoft Visual Studio

     

由于以下错误,无法更新目标数据库:

     

.Net SqlClient数据提供者:
  Msg 547,Level 16,State 0,Line 37
  ALTER TABLE语句与FOREIGN KEY约束冲突   “FK__UsersMenu__Break__0307610B”。冲突发生在数据库中   “MealGenius”,表“dbo.Menus”,列'MenuId'。

     

上次执行的命令:DECLARE @pv binary(16)

     

INSERT INTO [dbo]。[UsersMenuPlans]([UserMenuPlanId],[UserId],   [日期],[早餐],[MidMorningSnack],[午餐],[MidAfternoonSnack],   [晚餐],[MidNightSnack],[BreakfastShort],[LunchShort],   [DinnerShort],[甜点],[GreenDrink],[益生菌],[Snack1Short],   [Snack2Short])VALUES(33522,59,'20160801 00:00:00.000',823,536,   155,943,920,536,NULL,NULL,NULL,NULL,NU(命令被截断   适合消息框。)

据我了解,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)

脚本是:

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
  ALTER TABLE语句与FOREIGN KEY约束冲突   “FK__UsersMenu__Break__0307610B”。冲突发生在数据库中   “MealGenius”,表“dbo.Menus”,列'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.Breakfast为'0'值)。但是这个表如何与启用的外键一起存在?

2 个答案:

答案 0 :(得分:0)

您已经在UsersMenuPlans表中获得了FK打算强制执行的数据。

您现有的数据已经违反FK__UsersMenu__Break__0307610B强加的关键约束,因此无法创建约束。最有可能的是,这些现有行上的breakfast列要么为NULL,要么与Menus表中的有效MenuId不匹配。

您需要处理这些数据。首先创建约束不会有帮助,因为问题将变成由于约束而不会插入数据。

真正的问题可能是Menus表根本没有填充,这就解释了为什么引用的值不存在。在这种情况下,真正的解决方案是首先导入菜单表。

答案 1 :(得分:0)

我建议只需备份数据库并在LocalDB实例中恢复它。它会减轻痛苦。

如果您想知道UserMenuPlans中哪些行没有Menus中的行,请尝试

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