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

Sql server SQL Server:现有数据的外键问题,sql-server,database,visual-studio,visual-studio-2015,sql-server-2012,Sql Server,Database,Visual Studio,Visual Studio 2015,Sql Server 2012,我可以访问数据库,并希望使用Visual Studio 2015 SQL工具将其复制到本地PC(带有模式和数据) 我复制了模式,数据库有两个表:菜单(MenuId是主键)和UsersMenuPlans(Break是MenuId的外键,约束名为FK\uu UsersMenu\uuuuuuuu Break\uu 0307610B) 但当我尝试复制数据时,会出现一个错误: Microsoft Visual Studio 由于以下错误,无法更新目标数据库: .Net SqlClient数据提供程序: M

我可以访问数据库,并希望使用Visual Studio 2015 SQL工具将其复制到本地PC(带有模式和数据)

我复制了模式,数据库有两个表:
菜单
MenuId
是主键)和
UsersMenuPlans
Break
MenuId
的外键,约束名为
FK\uu UsersMenu\uuuuuuuu Break\uu 0307610B

但当我尝试复制数据时,会出现一个错误:

Microsoft Visual Studio

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

.Net SqlClient数据提供程序:
Msg 547,第16级,状态0,第37行
ALTER TABLE语句与外键约束冲突 “FK__用户菜单__中断__0307610B”。数据库中发生冲突 “MealGenius”,表“dbo.Menus”,列“MenuId”

最后执行的命令:DECLARE@pv binary(16)

插入到[dbo].[UsersMenuPlans]([UserMenuPlanId],[UserId], [日期],[早餐],[上午午餐],[下午三点], [晚餐],[夜宵],[早餐时间],[午餐时间], [餐厅],[甜点],[绿色饮料],[益生菌],[零食], [Snack2Short])值(3352259,'2016080100:00:00.000',823536, 155943920536,NULL,NULL,NULL,NULL,NU(命令被截断 以适应消息框。)

据我所知,
UsersMenuPlans
中的一些记录有
早餐
的值,这在
菜单
表,
MenuId
列中不存在,因此SQL工具无法复制它。这是怎么回事

本地服务器上的菜单表与远程服务器上的数据完全相同:

远程服务器是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])
错误是:

味精547,第16级,状态0,第380行
ALTER TABLE语句与外键约束冲突 “FK__用户菜单__中断__0307610B”。数据库中发生冲突 “MealGenius”,表“dbo.Menus”,列“MenuId”

已添加

我已经执行了脚本:

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

而且,正如我所预料的,存在一些记录(其中p.breaken是“0”值)。但是,启用外键后,这样的表如何存在呢?

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

您的现有数据已经违反了由
FK_uuuusersmenu_uuubreak_uu0307610b
施加的键约束,因此无法创建约束。最有可能的是,这些现有行上的
Break
列为空或与
菜单中的有效MenuId
表中的有效MenuId不匹配

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


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

我建议只备份数据库并在LocalDB实例中还原它。这样会比较省力

如果要确定
UserMenuPlans
中的哪些行在
菜单中没有行,请尝试以下操作

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

正在执行什么ALTER TABLE命令?我已将脚本添加到我的问题中。您是否先复制菜单数据,然后再添加约束?当然,菜单数据列表已经填充。您不认为以合理的方式实际命名FK约束会更直观吗?例如,使用
FK用户菜单早餐
而不是de>[FK\uuuuu UsersMenu\uuuu Break\uuuuu 0307610B]
:…表UsersMenuPlans为空,表菜单具有与远程服务器相同的记录。我只想按记录填充UsersMenuPlans,与远程服务器上的记录相同。不存在空的“早餐”我检查了远程服务器上的行。它可能有无效的MenuId,但它是如何存在的?外键存在,但数据无效?我了解它,并且确实存在一些这样的记录。但启用外键后,这样的表如何存在?