我可以访问数据库,并希望使用Visual Studio 2015 SQL工具将其复制到我的本地PC(使用架构和数据)。
我复制了模式,数据库有2个表:Menus
(MenuId
是主键)和UsersMenuPlans
(Breakfast
是MenuId
的外键,约束的名称为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工具可以'复制它。怎么会这样?
本地服务器上的菜单表与远程服务器上的数据完全相同:
远程服务器是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'值)。但是这个表如何与启用的外键一起存在?
答案 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