définir la valeur null dans une colonne de clé étrangère?
J'ai cette table
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
)
)
et une autre table
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]
Comme vous pouvez le voir, il y a une clé étrangère sur CityId, BranchId
. Le problème que j'ai est, si un utilisateur n'est pas entre dans sa ville (il peut choisir de ne pas, ce champ n'est pas obligatoire, alors la CityId
serait vide et lorsque j'essaie d'insérer cette valeur dans la CustomerMaster
table, je reçois ce message d'erreur indiquant que
L'instruction INSERT en conflit avec la contrainte de CLÉ ÉTRANGÈRE "fk_cdCityId_CityId". Le conflit est survenu dans la base de données "TestDatabase", table "dbo.CityMaster".
La déclaration a été résilié.
Donc, je veux savoir un moyen de contourner cela. - Je savoir si un d'unique ou d'une colonne de clé primaire est référencé en tant que clé étrangère, il ne peut pas être null. Mais, quel est le temps, quand j'ai mis
on delete set null
? Dans ce cas, si cette ligne est supprimée de CityMaster
il serait mis à null
dans CustomerMaster
(je veux dire de toutes ses références). donc, si c'est possible pourquoi et comment puis-je définir la valeur de cette clé étrangère null
manuellement?
Et si ce n'est pas possible par tout moyen, quel est le meilleur moyen d'éviter la situation que j'ai décrite?
source d'informationauteur Razort4x
Vous devez vous connecter pour publier un commentaire.
Si
CityId
est fixé àNULL
alors la contrainte de clé étrangère ne sera pas vérifié, et tout sera bon.D'autre part, si
CityId
est 0 (par exemple, parce que vous avez spécifiéDEFAULT ((0))
sur elle...), et il n'y a pas de ligne correspondante dansCityMaster
pour0,BranchId
puis ce sera d'ailleurs la cause de la contrainte de vérifier à l'échec.Une contrainte de clé étrangère sur une clé composite est activée uniquement si tous des colonnes impliquées sont non-
NULL
.Changement dans
insert query @
Cela vous permettra de stocker
Null
valeur comme vous l'a déclaré en tant que par défaut.