10

que tienen esta tabla¿establecer el valor nulo en una columna de clave externa?

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 
) 
) 

y otra mesa

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] 

Como se puede ver, hay una clave externa en CityId, BranchId. El problema que tengo es que si un usuario no ingresa a su ciudad (puede optar por no hacerlo, este campo no es obligatorio, entonces el CityId estaría en blanco y cuando intento insertar este valor en la tabla CustomerMaster, entiendo esto error diciendo

la sentencia INSERT en conflicto con la restricción FOREIGN KEY "fk_cdCityId_CityId". se ha producido el conflicto en la base de datos "TestDatabase", tabla "dbo.CityMaster". la instrucción se ha terminado.

por lo tanto, Quiero saber cómo evadir esto. Sé que si se hace referencia a una columna clave única o principal como una clave externa, no puede ser nula. Pero, ¿qué pasa con los tiempos, cuando configuré?on delete set null? En ese caso, si esa fila se elimina de CityMaster se establecería en null en CustomerMaster (me refiero a todas sus referencias). Entonces, si eso es posible, ¿por qué y cómo puedo configurar el valor en esta clave externa null manualmente? Y si eso no es posible de ninguna manera, ¿cuál es la mejor manera de eludir la situación que describí?

Respuesta

17

Si CityId se establece en NULL, la restricción de la clave externa no se marcará, y todo estará bien.

Por otro lado, si CityId es 0 (por ejemplo, debido a que ha especificado DEFAULT ((0)) en él ...), y no hay ninguna fila coincidente en CityMaster para 0,BranchId, entonces este hecho hará que la restricción de comprobación falle.

Una restricción de clave externa en una clave compuesta únicamente se comprueba si todos de las columnas implicadas son no NULL.

+0

@ damien-the-unbeliever: Entonces, ¿debería eliminar esta cláusula 'default (0)'? – Razort4x

+1

@ Razort4x - Yo diría que sí. –

+0

bueno, no me ayudó –

3

Cambio en insert query @

[CityId] [int] DEFAULT NULL 

Esto le permitirá almacenar Null valor a medida que lo declaró como predeterminado.

Cuestiones relacionadas