установить нулевое значение в столбце внешнего ключа?

у меня есть эта таблица

CREATE TABLE [dbo].[CityMaster](
    [CityID] [int] NOT NULL,
    [City] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CityM__Branc__74444068]  DEFAULT ((0)),
    [ExternalBranchId] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_CityMaster] PRIMARY KEY CLUSTERED 
(
    [City] ASC,
    [BranchId] ASC
),
 CONSTRAINT [uk_citymaster_cityid_branchid] UNIQUE NONCLUSTERED 
(
    [CityID] ASC,
    [BranchId] ASC
)
)

и еще стол

CREATE TABLE [dbo].[CustomerMaster](
    [ID] [int] NOT NULL,
    [CustomerCode] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerAddress] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerPhone] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CustomerEmailId] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CustomerPriority] [int] NOT NULL CONSTRAINT [DF_CustomerMaster_CustomerPriority]  DEFAULT ((0)),
    [CustomerRegisterDate] [datetime] NULL,
    [CustomerIsActive] [bit] NULL CONSTRAINT [DF_CustomerMaster_CustomerIsActive]  DEFAULT ((1)),
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CustomerM__Branc__67DE6983]  DEFAULT ((0)),
    [CityId] [int] NULL CONSTRAINT [DF_CustomerMaster_CityId]  DEFAULT ((0)),
 CONSTRAINT [PK_CustomerMaster] PRIMARY KEY CLUSTERED 
(
    [CustomerCode] ASC,
    [BranchId] ASC
)
) ON [PRIMARY]

ALTER TABLE [dbo].[CustomerMaster]  WITH CHECK ADD  CONSTRAINT [fk_cdCityId_CityId] FOREIGN KEY([CityId], [BranchId])
REFERENCES [dbo].[CityMaster] ([CityID], [BranchId])

ALTER TABLE [dbo].[CustomerMaster] CHECK CONSTRAINT [fk_cdCityId_CityId]

Как видите, на CityId, BranchId есть внешний ключ. Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь не вводит свой город (он может отказаться, это поле не является обязательным, тогда CityId будет пустым, и когда я пытаюсь вставить это значение в таблицу CustomerMaster, я получаю это ошибка

Инструкция INSERT конфликтует с ограничением FOREIGN KEY "fk_cdCityId_CityId". Конфликт произошел в базе данных "TestDatabase", таблица "dbo.CityMaster". Заявление было прекращено.

Итак, я хочу знать, как обойти это. Я знаю, что если уникальный столбец или столбец первичного ключа упоминается как внешний ключ, он не может быть нулевым. Но как насчет времени, когда я установил on delete set null? В этом случае, если эта строка будет удалена из CityMaster, она будет установлена ​​на null в CustomerMaster (я имею в виду все ее ссылки). Итак, если это возможно, почему и как я могу установить значение в этом внешнем ключе null вручную? И если это невозможно каким-либо образом, как лучше всего обойти ситуацию, которую я описал?


person Razort4x    schedule 19.09.2012    source источник


Ответы (2)


Если CityId установлено в NULL, то ограничение внешнего ключа не будет проверяться, и все будет хорошо.

С другой стороны, если CityId равно 0 (скажем, потому что вы указали для него DEFAULT ((0))...), а в CityMaster нет соответствующей строки для 0,BranchId, то это действительно приведет к сбою проверки ограничения.

Ограничение внешнего ключа для составного ключа проверяется только в том случае, если все задействованные столбцы не являются NULL.

person Damien_The_Unbeliever    schedule 19.09.2012
comment
@damien-the-unbeliever: Итак, я должен удалить этот пункт default (0)? - person Razort4x; 19.09.2012
comment
@ Razort4x - я бы сказал, да. - person Damien_The_Unbeliever; 19.09.2012

Изменение в insert query @

[CityId] [int] DEFAULT NULL

Это позволит вам сохранить значение Null, как вы объявили его по умолчанию.

person Chetan    schedule 25.04.2015