Реализация необязательных отношений (применяется, если FK не ноль) - PullRequest
0 голосов
/ 15 сентября 2011

Предположим, у нас есть эти таблицы

Person( person_id, name, car_id )
CompanyCar( car_id, make, model, colour, plate )

Person.car_id должен быть внешним ключом для CompanyCar.car_id, но я хочу, чтобы Person.car_id был обнуляемым, поэтому при запуске sqlmetal для генерации linqto-sql DataContext, я должен получить

class Person{
    int person_id,
    string name,
    int? car_id,
    CompanyCar companyCar //object references may hold null
}

и , если присутствует , Person.car_id должен существовать в CompanyCar.

Согласно прочитанной мною документации MSDN, это не должно быть возможным, но когда мы попробовали, это сработало.Мало кто, кажется, пишет или спрашивает об этом типе отношений в Интернете.

Могу ли я доверять принудительному применению этого внешнего ключа, хотя он и является необязательным?

ОБНОВЛЕНИЕ: Вот что генерирует SMSS, когда я запросил скрипт CREATE.Обратите внимание, что FK создан как NOCHECK , но он выдает жалобу, если я ввожу CarID (например, 9999), которого, как мне известно, в таблице CompanyCar нет.

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Person](
    [PersonID] [int] NOT NULL,
    [Name] [varchar](100) NOT NULL,
    [CarID] [int] NULL
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [PersonID] ASC
)WITH FILLFACTOR = 92 ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Person]  WITH NOCHECK ADD  CONSTRAINT [FK_Person_CompanyCar] FOREIGN KEY([CarID])
REFERENCES [dbo].[CompanyCar] ([CarID])
GO

несоответствия имен, работа требует именования примеров)

1 Ответ

1 голос
/ 15 сентября 2011

Ссылка FK на обнуляемый столбец работает точно так, как вы надеетесь. Когда присутствует ненулевое значение, ограничение FK применяется нормально. Значение NULL не проверяется ограничением FK, так как значение в настоящее время неизвестно, и невозможно сказать, нарушает ли оно ограничение или нет.

...