разрешение внешних ограничений между связанными таблицами - PullRequest
0 голосов
/ 10 августа 2009

У меня есть две таблицы A и B с A, ссылающиеся на столбец в B с ограничением внешнего ключа. Теперь я пытаюсь добавить больше столбцов и ограничений в таблицу A, удалив таблицу A и снова создав таблицу A с новыми столбцами. SQL Server Mgmt Studio предоставляет опцию «Drop and Create», где я изменяю оператор create table, чтобы добавить больше столбцов.

При выполнении операторов выдается ошибка, указывающая на то, что на A ссылается ограничение внешнего ключа. Чтобы это исправить, мне пришлось удалить ограничение внешнего ключа из таблицы 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

Ответы [ 3 ]

2 голосов
/ 10 августа 2009

Решение: не используйте конструктор таблиц в Management Studio. Шутки в сторону. Не. Это пережиток более десяти лет назад, и он не очень хорошо знает SQL. (Проверьте connect.microsoft.com, и вы найдете много, много ошибок и предложений, поданных против него.)

Вы можете (и должны) добавлять столбцы и ограничения, используя SQL без удаления и повторного создания таблицы, копирования данных, повторного создания ограничений и т. Д.

ALTER TABLE A ADD myNewColumn int;
ALTER TABLE A ADD CONSTRAINT ...

Если у вас есть конкретная ситуация, для которой вы не знаете SQL, укажите операторы CREATE TABLE / INDEX / CONSTRAINT и объясните, что вам нужно делать.

Добавлено: для примера, который вы добавили в свой вопрос, вот одна строка SQL. Я добавил значения по умолчанию только потому, что они понадобятся вам, если ваша таблица уже содержит данные, когда вы добавляете столбцы, которые НЕ НЕДЕЙСТВИТЕЛЬНЫ.

ALTER TABLE dbo.TableA ADD PhotoWidth INT NOT NULL DEFAULT 640, PhotoHeight INT NOT NULL DEFAULT 480;
1 голос
/ 10 августа 2009

Я никогда не сталкивался с этой проблемой. Когда я изменяю таблицу, я использую конструктор для добавления столбцов, сохранения, и он работает как по волшебству ... Он предупреждает меня о других таблицах, ссылающихся на эту, но я нажимаю "ОК", и моя таблица изменяется!

В любом случае, вы можете удалить ограничения ссылок для таблиц, выполнив:

ALTER TABLE [name] NOCHECK CONSTRAINT ALL

и включите их с помощью:

ALTER TABLE [name] CHECK CONSTRAINT ALL

Если вы изменяете много таблиц, вы можете сделать:

До изменений:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

После внесения изменений:

EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
0 голосов
/ 10 августа 2009

Нет, вы должны отбросить ограничения. Но хорошие новости! в том, что вы можете использовать select из таблиц information_schema (или эквивалент вашей rdbms) для генерации операторов alter table drop constraint.

Ах, но Стив Касс прочитал ваш вопрос более внимательно, чем я. Просто добавьте столбцы, не опуская таблицу, с alter table add column ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...