SQL Server 2005: обнуляемое ограничение внешнего ключа - PullRequest
15 голосов
/ 01 февраля 2009

У меня есть ограничение внешнего ключа между таблицами Sessions и Users. В частности, Sessions.UID = Users.ID. Иногда я хочу, чтобы Sessions.UID был нулевым. Можно ли это позволить? Каждый раз, когда я пытаюсь это сделать, я получаю нарушение FK Constraint.

В частности, я вставляю строку в сеансы через LINQ. Я установил Session.User = null; и я получаю эту ошибку:

An attempt was made to remove a relationship between a User and a Session. However, one of the relationship's foreign keys (Session.UID) cannot be set to null.

Однако, когда я удаляю строку, которая обнуляет свойство User, я получаю эту ошибку в моей строке SubmitChanges:

Value cannot be null.
Parameter name: cons

Ни в одной из моих таблиц нет поля с именем cons, и его нет ни в моем файле DataContext.designer.cs размером 5500 строк, ни в QuickWatch ни для одного из связанных объектов, поэтому я понятия не имею, что ' минусы это.

В базе данных Session.UID - это пустое int-поле, а User.ID - ненулевое int. Я хочу записывать сеансы, которые могут иметь или не иметь UID, и я бы предпочел сделать это, не отключая ограничения для этого отношения FK. Есть ли способ сделать это?

1 Ответ

27 голосов
/ 19 февраля 2009

Я, кажется, уже помнил создание обнуляемого FK раньше, поэтому я быстро провел тест. Как вы можете видеть ниже, это определенно выполнимо (протестировано на MSSQL 2005).

Запишите соответствующие части ваших таблиц и ограничений и опубликуйте их, чтобы мы могли продолжить устранение неполадок.

CREATE DATABASE [NullableFKTest]
GO
USE [NullableFKTest]
GO
CREATE TABLE OneTable 
(
    OneId  [int] NOT NULL,
    CONSTRAINT [PK_OneTable] PRIMARY KEY CLUSTERED 
    (
        [OneId] ASC
    )
)
CREATE TABLE ManyTable (ManyId  [int] IDENTITY(1,1) NOT NULL, OneId [int] NULL)
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ManyTable_OneTable]') AND parent_object_id = OBJECT_ID(N'[dbo].[ManyTable]') )
ALTER TABLE [dbo].[ManyTable]  WITH CHECK ADD CONSTRAINT [FK_ManyTable_OneTable] FOREIGN KEY([OneId])
    REFERENCES [dbo].[OneTable] ([OneId])   
GO

--let's get a value in here
insert into OneTable(OneId) values(1)
select* from OneTable

--let's try creating a valid relationship to the FK table OneTable
insert into ManyTable(OneId) values (1) --fine
--now, let's try NULL
insert into ManyTable(OneId) values (NULL) --also fine
--how about a non-existent OneTable entry?
insert into ManyTable(OneId) values (5) --BOOM! - FK violation

select* from ManyTable
--1, 1
--2, NULL

--cleanup
ALTER TABLE ManyTable DROP CONSTRAINT FK_ManyTable_OneTable
GO
drop TABLE OneTable
GO
drop TABLE ManyTable
GO
USE [Master]
GO
DROP DATABASE NullableFKTest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...