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:
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:
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.
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
Hola
ResponderEliminar