У меня есть две таблицы A и B с ссылкой на столбец в B с ограничениями внешнего ключа. Теперь я пытаюсь добавить больше столбцов и ограничений в таблицу A, отбросив таблицу A и снова создав таблицу A новыми столбцами. SQL Server Mgmt Studio предоставляет опцию «Drop and Create» для этого, когда я изменяю инструкцию create table, чтобы добавить больше столбцов.Разрешение внешних ограничений между связанными таблицами
Выполнение инструкций выдает сообщение об ошибке, на которое А ссылается на ограничение внешнего ключа. Чтобы исправить это, мне пришлось удалить ограничение внешнего ключа из таблицы A, а затем выполнить команду «drop and create». В моем случае я мог бы сделать это, сбросив одно ограничение. Я не могу сделать то же самое с набором таблиц, перекрестно ссылающихся друг на друга. Это должно быть обычным явлением для большинства разработчиков SQL, и мне интересно, есть ли способ справиться с этой ситуацией, не удаляя и не воссоздавая сеть ограничений между таблицами.
Цените свои комментарии!
ПРИМЕР SQL: Текущая таблица:
CREATE TABLE [dbo].[TableA](
[PhotoId] [bigint] IDENTITY(1,1) NOT NULL,
[PhotoTypeId] [bigint] NOT NULL,
[PhotoDescription] [nvarchar](max) NULL,
[LastModifiedBy] [bigint] NOT NULL,
[LastModifiedDate] [datetime] NOT NULL,
CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED
(
[PhotoId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[TableA] WITH NOCHECK ADD CONSTRAINT [FK_TableA_TableAType] FOREIGN KEY([PhotoTypeId])
REFERENCES [dbo].[TableAType] ([PhotoTypeId])
GO
ALTER TABLE [dbo].[TableA] NOCHECK CONSTRAINT [FK_TableA_TableAType]
GO
ALTER TABLE [dbo].[TableA] WITH NOCHECK ADD CONSTRAINT [FK_TableA_TableB1] FOREIGN KEY([LastModifiedBy])
REFERENCES [dbo].[TableB] ([UserId])
GO
ALTER TABLE [dbo].[TableA] NOCHECK CONSTRAINT [FK_TableA_TableB1]
GO
ALTER TABLE [dbo].[TableA] ADD CONSTRAINT [DF_TableA_IsDeleted] DEFAULT ((0)) FOR [IsDeleted]
GO
ожидается таблица
CREATE TABLE [dbo].[TableA](
[PhotoId] [bigint] IDENTITY(1,1) NOT NULL,
[PhotoTypeId] [bigint] NOT NULL,
[PhotoDescription] [nvarchar](max) NULL,
***[PhotoWidth] [int] NOT NULL,
[PhotoHeight] [int] NOT NULL,***
[LastModifiedBy] [bigint] NOT NULL,
[LastModifiedDate] [datetime] NOT NULL,
CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED
(
[PhotoId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[TableA] WITH NOCHECK ADD CONSTRAINT [FK_TableA_TableAType] FOREIGN KEY([PhotoTypeId])
REFERENCES [dbo].[TableAType] ([PhotoTypeId])
GO
ALTER TABLE [dbo].[TableA] NOCHECK CONSTRAINT [FK_TableA_TableAType]
GO
ALTER TABLE [dbo].[TableA] WITH NOCHECK ADD CONSTRAINT [FK_TableA_TableB1] FOREIGN KEY([LastModifiedBy])
REFERENCES [dbo].[TableB] ([UserId])
GO
ALTER TABLE [dbo].[TableA] NOCHECK CONSTRAINT [FK_TableA_TableB1]
GO
ALTER TABLE [dbo].[TableA] ADD CONSTRAINT [DF_TableA_IsDeleted] DEFAULT ((0)) FOR [IsDeleted]
GO
Я всегда использую дизайнер, и это на самом деле работает довольно хорошо. Это также намного быстрее для большинства случаев. – Kevin
спасибо steve. добавлен образец кода SQL. – pencilslate
@Kevin: «Быстрее для большинства случаев», чем что? Дизайнер генерирует SQL и/или хранимые вызовы proc, которые любой может написать (но часто не должен). Как вызовы SQL и proc дизайнера могут быть быстрее, чем SQL-запросы разработчика и proc? –