sábado, 7 de junio de 2014

Las columnas de la tabla ‘’ no coinciden con las restricciones PRIMARY KEY o UNIQUE existentes.

Algunas veces intentamos crear una tabla en SQL SERVER ya sea a través de un script o a través de los menús, y en el momento de crear una clave foránea a otra tabla nos da es siguiente error:

Las columnas de la tabla no coinciden con las restricciones PRIMARY KEY o UNIQUE existentes

En este caso hemos creado una tabla Pagos y uno de sus campos es strNumeroFactura que depende de la tabla “padre” Facturas”.  Por otra parte nuestra tabla también contiene los campos código y NID pertenecientes a la tabla Documentos.
El esquema que queremos montar es el siguiente:

restricciones primary key

Al ejecutar este  este código para generar la tabla nos da el error.

/****** Objeto:  Table [Dbo].[Pagos]    Fecha de la secuencia de comandos: 04/28/2014 18:09:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [Dbo].[Pagos](
      [Codigo] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [NID] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [strNumeroFactura] [char](13) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [datFecha] [datetime] NULL,
      [curImporte] [decimal](19, 2) NULL,
 CONSTRAINT [PK_Pagos] PRIMARY KEY CLUSTERED
(
      [Codigo] ASC,
      [NID] ASC,
      [strNumeroFactura] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [Dbo].[Pagos]  WITH CHECK ADD  CONSTRAINT [FK_CPJ_1] FOREIGN KEY([Codigo], [NID])
REFERENCES [Dbo].[Documentos] ([Codigo], [NID])
ALTER TABLE [Dbo].[Pagos]  WITH CHECK ADD  CONSTRAINT [FK_CPJ_2]
FOREIGN KEY([strNumeroFactura])
REFERENCES [Dbo].[Facturas] ([strNumeroFactura])
GO

Al ejecutar sale este error:

Mens. 1776, Nivel 16, Estado 0, Línea 24
No hay claves principales ni candidatas en la tabla a la que se hace referencia ('Dbo.Facturas') que concuerden con la lista de columnas que hace la referencia en la clave externa 'FK_CPJ_2'.
Mens. 1750, Nivel 16, Estado 0, Línea 24
No se pudo crear la restricción. Consulte los errores anteriores.

O bien desde diseño sale el mismo error.

no hay claves principales ni candidatas en la tabla

Este error sale por que no hemos tenido en cuenta que la clave primaria de la tabla facturas tiene dos campos y no uno. No es posible trasladar una clave primaria de una tabla padre a una hija sólo parcialmente, hay que trasladar la clave entera, para ello hay que añadir a la nueva tabla todas las columnas de la clave principal de la tabla padre.
En negrita se muestra el nuevo campo añadido.

/****** Objeto:  Table [Dbo].[Pagos]    Fecha de la secuencia de comandos: 04/28/2014 18:09:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [Dbo].[Pagos](
      [Codigo] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [NID] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [strCodigo] [char](3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [strNumeroFactura] [char](13) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
      [datFecha] [datetime] NULL,
      [curImporte] [decimal](19, 2) NULL,
 CONSTRAINT [PK_Pagos] PRIMARY KEY CLUSTERED
(
      [Codigo] ASC,
      [NID] ASC,
      [strCodigo] ASC,
      [strNumeroFactura] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [Dbo].[Pagos]  WITH CHECK ADD  CONSTRAINT [FK_CPJ_1] FOREIGN KEY([Codigo], [NID])
REFERENCES [Dbo].[Documentos] ([Codigo], [NID])
ALTER TABLE [Dbo].[Pagos]  WITH CHECK ADD  CONSTRAINT [FK_CPJ_2]
FOREIGN KEY([strCodigo],[strNumeroFactura])
REFERENCES [JUSTIFICANTES].[Facturas] ([strCodigo],[strNumeroFactura])
GO


1 comentario: