Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Внешний ключ к текущей таблице  [new]
Luft-on
Member

Откуда:
Сообщений: 4
Вопрос может показаться глупым, но сейчас сел разрабатывать небольшую БД для своих целей. Необходимо представить некую древовидную структуру групп. Т.е. у группы может быть родительская группа, соответственно у группы могут быть подгруппы. Завёл поле
[ParentId] INT NULL

хотел добавить внешний ключ
CONSTRAINT [FK_Group_Parent] FOREIGN KEY ([ParentId]) REFERENCES [dbo].[Group] ([Id]) ON DELETE SET NULL ON UPDATE CASCADE

Ну и получаю исключение:
Introducing FOREIGN KEY constraint 'FK_Group_Parent' on table 'Group' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Где здесь циклическое обновление? Я хочу чтобы на уровне базы данных при удалении одной из родительских групп все подгруппы становились корневыми. Я так понимаю это и значит данная запись
ON DELETE SET NULL

Если произойдёт ситуация ON DELETE или ON UPDATE это же никоим образом не отразится на значении главного ключа дочерней записи или её наличии - изменится лишь её внешний ключ.
Может я не правильно понимаю что-то? Как тогда реализовать родительско-дочернее отношение одной таблицы? Неужели как-то так:
CREATE TABLE [dbo].[GroupGroup]
(
	[Id] INT NOT NULL PRIMARY KEY IDENTITY, 
	[GroupId] INT NOT NULL UNIQUE,
	[ParentGroupId] INT NOT NULL, 
	CONSTRAINT [FK_GroupGroup_Group] FOREIGN KEY ([GroupId]) REFERENCES [Group]([Id]) ON DELETE CASCADE ON UPDATE CASCADE, 
	CONSTRAINT [FK_GroupGroup_ParentGroup] FOREIGN KEY ([ParentGroupId]) REFERENCES [Group]([Id]) ON DELETE CASCADE ON UPDATE CASCADE 
)
19 дек 14, 00:04    [17020220]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ к текущей таблице  [new]
Klemzig
Guest
Схему вы изначально сделали правильную, но никаких действий на такие внешние ключи вешать нельзя, бу дезигн. Все модификации данных делать ручками, никакой автоматики.

Почему нельзя:
if object_id('dbo.GroupTest', 'U') is not null
	drop table dbo.GroupTest;
go
create table dbo.GroupTest (
	Id int not null,
	ParentId int null,
	Value varchar(20) not null,
	constraint [PK_GroupTest] primary key (Id),
	constraint [FK_GroupTest_Tree] foreign key (ParentId) references dbo.GroupTest(Id)
);
go
insert into dbo.GroupTest (Id, ParentId, Value)
values
	(1, 1, 'Self-root');
go
select * from dbo.GroupTest;
go
Инджой
19 дек 14, 02:19    [17020465]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ к текущей таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Klemzig
никаких действий на такие внешние ключи вешать нельзя, бу дезигн
Поподробнее, пожалуйста.
Вам по рукам бьют что ли?

Единственно с чем согласен - ON UPDATE CASCADE применять лучше не надо.
Да и UPDATE PK - зачем? Естественный PK? Почему не суррогатный?
19 дек 14, 09:28    [17020892]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ к текущей таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Вероятно, сообщение имеет в виду, что сервер не сможет выполнить всю цепочку удалений при обращении таблицы самой к себе.
19 дек 14, 09:50    [17021021]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить