Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 foreign key constraint .... on delete set default  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
День добрый,
не понимаю почему не срабатывает foreign key constraint (SET DEFAULT) при удалении.


Есть 2 простеньких таблички (извините что много букв, таблички реально простые):
+ Скрипт создания табличек

/****** Object:  Table [dbo].[Header table]    Script Date: 11/19/2012 22:38:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Header table](
	[Header row id] [int] IDENTITY(1,1) NOT NULL,
	[Header col 1] [nvarchar](50) NULL,
	[Header col 2] [nvarchar](50) NULL,
	[Header col 3] [nvarchar](50) NULL,
 CONSTRAINT [PK_Header table] PRIMARY KEY CLUSTERED 
(
	[Header row 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
SET IDENTITY_INSERT [dbo].[Header table] ON
INSERT [dbo].[Header table] ([Header row id], [Header col 1], [Header col 2], [Header col 3]) VALUES (4, N'some data in header', N'some data in header', N'some data in header')
INSERT [dbo].[Header table] ([Header row id], [Header col 1], [Header col 2], [Header col 3]) VALUES (5, N'some data in header', N'some data in header', N'some data in header')
SET IDENTITY_INSERT [dbo].[Header table] OFF




/****** Object:  Table [dbo].[Lines table]    Script Date: 11/19/2012 22:38:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Lines table](
	[Lines table row id] [int] IDENTITY(1,1) NOT NULL,
	[Header row id] [int] NOT NULL,
	[Lines col 1] [nvarchar](50) NULL,
	[Lines col 2] [nvarchar](50) NULL,
	[Lines col 3] [nvarchar](50) NULL,
 CONSTRAINT [PK_Lines table] PRIMARY KEY CLUSTERED 
(
	[Lines table row 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
SET IDENTITY_INSERT [dbo].[Lines table] ON
INSERT [dbo].[Lines table] ([Lines table row id], [Header row id], [Lines col 1], [Lines col 2], [Lines col 3]) VALUES (1, 4, N'some data in lines', N'some data in lines', N'some data in lines')
INSERT [dbo].[Lines table] ([Lines table row id], [Header row id], [Lines col 1], [Lines col 2], [Lines col 3]) VALUES (2, 4, N'some data in lines', N'some data in lines', N'some data in lines')
INSERT [dbo].[Lines table] ([Lines table row id], [Header row id], [Lines col 1], [Lines col 2], [Lines col 3]) VALUES (3, 5, N'some data in lines', N'some data in lines', N'some data in lines')
INSERT [dbo].[Lines table] ([Lines table row id], [Header row id], [Lines col 1], [Lines col 2], [Lines col 3]) VALUES (5, 5, N'some data in lines', N'some data in lines', N'some data in lines')
SET IDENTITY_INSERT [dbo].[Lines table] OFF
/****** Object:  Default [DF_Lines table_Header row id]    Script Date: 11/19/2012 22:38:09 ******/
ALTER TABLE [dbo].[Lines table] ADD  CONSTRAINT [DF_Lines table_Header row id]  DEFAULT ((-500)) FOR [Header row id]
GO
/****** Object:  ForeignKey [FK_Lines table_Header table]    Script Date: 11/19/2012 22:38:09 ******/
ALTER TABLE [dbo].[Lines table]  WITH CHECK ADD  CONSTRAINT [FK_Lines table_Header table] FOREIGN KEY([Header row id])
REFERENCES [dbo].[Header table] ([Header row id])
ON UPDATE SET DEFAULT
ON DELETE SET DEFAULT
GO
ALTER TABLE [dbo].[Lines table] CHECK CONSTRAINT [FK_Lines table_Header table]
GO


после создания, запускаю команду:
DELETE FROM [Header table]
WHERE ([Header row id] = 4)


Результат:
Msg 547, Level 16, State 0, Line 3
The DELETE statement conflicted with the FOREIGN KEY constraint "FK_Lines table_Header table". The conflict occurred in database "TestDatabase", table "dbo.Header table", column 'Header row id'.

The statement has been terminated.

Что не так?

Спасибо.
19 ноя 12, 22:48    [13497233]     Ответить | Цитировать Сообщить модератору
 Re: foreign key constraint .... on delete set default  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
BOL
SET DEFAULT
Все значения, содержащие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в значения по умолчанию. Для выполнения этого ограничения все столбцы внешних ключей должны иметь определения по умолчанию. Если столбец допускает значения NULL и значение по умолчанию явно не определено, значением столбца по умолчанию становится NULL.
А у вас
CREATE TABLE [dbo].[Lines table](
	[Lines table row id] [int] IDENTITY(1,1) NOT NULL,
	[Header row id] [int] NOT NULL,
...
19 ноя 12, 23:11    [13497302]     Ответить | Цитировать Сообщить модератору
 Re: foreign key constraint .... on delete set default  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
invm,

глупая ошибка.
Спасибо.
19 ноя 12, 23:13    [13497310]     Ответить | Цитировать Сообщить модератору
 Re: foreign key constraint .... on delete set default  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Прошу прощения, не заметил
ALTER TABLE [dbo].[Lines table] ADD  CONSTRAINT [DF_Lines table_Header row id]  DEFAULT ((-500)) FOR [Header row id]


Добавьте в [dbo].[Header table] строку с [dbo].[Header row id] = -500
19 ноя 12, 23:15    [13497316]     Ответить | Цитировать Сообщить модератору
 Re: foreign key constraint .... on delete set default  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
invm,

Не совсем понял.
Строку я добавил. Если в таблице Lines есть строка с [Header row id] (отключил autoincrement) то вылетает та же самая ошибка.
Если в Lines такой строки нет, то удаление проходит на ура.
19 ноя 12, 23:20    [13497334]     Ответить | Цитировать Сообщить модератору
 Re: foreign key constraint .... on delete set default  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
Gena928,

а нет, заработало. спасибо.
19 ноя 12, 23:23    [13497342]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить