Для людей, использующих SQL Server Management Studio:
Я абсолютно видел случаи, когда пользовательский интерфейс не синхронизировался с БД, даже если вы обновили список ключей илиоткрыл совершенно новый экземпляр.
Для моего случая у меня есть Order
, в котором есть DiscountedItem
дочерние элементы.
Чтобы проверить, не работает ли синхронизация, нужно щелкнуть правой кнопкой мышиFK_DiscountedItem_Order
и выберите Script Key as CREATE To Clipboard
, а затем изучите, что вы получите:
Вы должны получить что-то вроде этого:
ALTER TABLE [dbo].[DiscountedItem] WITH NOCHECK ADD CONSTRAINT [FK_DiscountedItem_Order] FOREIGN KEY([OrderId])
REFERENCES [dbo].[Order] ([OrderId])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[DiscountedItem] CHECK CONSTRAINT [FK_DiscountedItem_Order]
GO
Где вы можете ясно видеть DELETE CASCADE
.
Если вы получите что-то вроде следующего, тогда правило каскада фактически неактивно, несмотря на то, что пользовательский интерфейс может сказать:
ALTER TABLE [dbo].[DiscountedItem] WITH CHECK ADD CONSTRAINT [FK_DiscountedItem_Order] FOREIGN KEY([OrderId])
REFERENCES [dbo].[Order] ([OrderId])
GO
Я просто удалил его (пришлось фактически удалитьэто дважды) и воссоздал его, чтобы получить правильный SQL.
Вам может потребоваться выполнить что-то вроде этого, чтобы проверить «сиротские» дочерние строки:
select * from DiscountedItem where DiscountedItem.orderid not in (select orderid from [order])
И затем, если это можно сделать безопасно:
delete from DiscountedItem where DiscountedItem.orderid not in (select orderid from [order])
Почему это произошло?
I , просто добавил ограничение и сразу получил ошибку внешнего ключа, потому что у меня были потерянные строки.Затем что-то запуталось, и он подумал, что каскад включен.
Поэтому, прежде чем создавать новое ограничение в пользовательском интерфейсе, я рекомендую всегда сначала проверять наличие потерянных строк.Вам все равно придется их удалить, если они существуют.