Как создать составной ключ-кандидат для таблицы в SQL Server?
Пожалуйста, рассмотрите следующее определение таблицы...
Определение таблицы
CREATE TABLE [dbo].[Folders](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[ParentFolderId] [int] NULL
PRIMARY KEY CLUSTERED
(
[Id] 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
Другие таблицы имеют отношение внешнего ключа к столбцу первичного ключа этой таблицы. [id]
,
Я хочу добавить ограничение внешнего ключа, ссылающееся на себя, где идентификатор родительской папки ссылается на поле идентификатора другой записи в той же таблице папок, но идентификатор пользователя также должен совпадать...
Самостоятельная привязка внешнего ключа
ALTER TABLE [dbo].[Folders] WITH CHECK ADD CONSTRAINT [FK_Folders_ParentFolder] FOREIGN KEY([UserId], [ParentFolderId])
REFERENCES [dbo].[Folders] ([UserId], [Id])
GO
ALTER TABLE [dbo].[Folders] CHECK CONSTRAINT [FK_Folders_ParentFolder]
GO
... но я получаю ошибки...
ошибки
Msg 1776, Level 16, State 0, Line 64
There are no primary or candidate keys in the referenced table 'dbo.Folders' that match the referencing column list in the foreign key 'FK_Folders_ParentFolder'.
Msg 1750, Level 16, State 0, Line 64
Could not create constraint or index. See previous errors.
Msg 4917, Level 16, State 0, Line 67
Constraint 'FK_Folders_ParentFolder' does not exist.
Msg 4916, Level 16, State 0, Line 67
Could not enable or disable the constraint. See previous errors.
Я попытался добавить составной уникальный индекс в таблицу, чтобы предоставить ключ-кандидат, но это не сработало, я все еще получаю ту же ошибку.
Уникальный индекс
CREATE UNIQUE NONCLUSTERED INDEX [IX_Folders_UserParentFolder] ON [dbo].[Folders]
(
[UserId] ASC,
[ParentFolderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Как создать ключ суперключа / кандидата на [Id]
а также [UserId]
такой, что я могу добавить собственный ссылочный внешний ключ? Помните, что преобразование первичного ключа из единого целого в составной ключ приведет к нарушению внешних ключей в других таблицах, ссылающихся на таблицу "Папки". Эти внешние ключи не должны знать о UserId.
РЕДАКТИРОВАТЬ:
В соответствии с предложением / комментариями Дэна Гузмана добавление ограничения базы данных сделало свое дело. Вот определение ограничения...
Определение ограничения
ALTER TABLE [dbo].[Folders]
ADD CONSTRAINT AK_Folders_UserId UNIQUE ([UserId], [Id])
GO
1 ответ
Столбцы, на которые ссылаются столбцы внешнего ключа, должны быть первичным ключом, уникальным ограничением или уникальным индексом. Я предлагаю уникальное ограничение здесь:
ALTER TABLE dbo.Folders
ADD CONSTRAINT UQ_Folders_UserId_Id UNIQUE(UserId, Id);