foreing keys en tablas

20/04/2010 - 05:58 por Dante | Informe spam
Amigos,

Una consulta tengo dos tablas una llamada facturaheader con dos campos
Primary Keys (anio,pk) y otra tabla facturadetalle con campos
(anio,factura,producto,cantidad,etc)

una duda es como hago que la tabla detalle en los campos anio,factura
que son pk de la tabla facturaheader sean foreing keys en la tabla detalle.

a la espera de su pronta ayuda

dante
 

Leer las respuestas

#1 Alejandro Mesa
20/04/2010 - 14:56 | Informe spam
Dante,

Debes crear una restriccion tipo "foreign key".

create table dbo.factura_cabecera (
anio smallint not null,
pk int not null,
... otras columnas aqui
constraint PK_factura_cabecera primary key (anio, pk)
);
GO
create table dbo.factura_detalle (
anio smallint not null,
factura int not null,
producto int not null,
... otras columnas aqui,
constraint PK_factura_detalle primary key (anio, pk, producto),
constraint FK_factura_detalle_factura_cabecera foreigh key (anio, factura)
references dbo.factura_cabecera(anio, pk)
);
GO

alter table dbo.factura_detalle
with check add constraint FK_factura_detalle_factura_cabecera foreign key
(anio, factura) references dbo.factura_cabecera(anio, pk)
);
GO

Si la sentencia en el caso 2 falla por razones de existencia de filas hijas
apuntando a padres no validos, entonces tienes dos opciones para implementar
la restriccion. Una seria arreglar las las filas en la tabla detalle que no
tienen un padre valido, y luego agregar la restriccion. La segunda seria
agregando la restriccion con la opcion "with nocheck", pero ten en cuenta que
la restriccion quedaria como no confiable. Esta ultima opcion no chequeara la
filas existentes pero si las nuevas.

alter table dbo.factura_detalle
with check add constraint FK_factura_detalle_factura_cabecera foreign key
(anio, factura) references dbo.factura_cabecera(anio, pk)
);
GO

Puedes chequear la confiabilidad de la restriccion usando:

SELECT
[name], is_not_trusted
FROM
sys.foreign_keys
WHERE
parent_object_id = OBJECT_ID('dbo.factura_detalle', 'U')
AND [name] = N'FK_factura_detalle_factura_cabecera';
GO

Ten en cuenta que no he tocado o plasmado ninguna referencia respecto a la
tabla [producto]. Eso queda de tu parte.


AMB



"Dante" wrote:

Amigos,

Una consulta tengo dos tablas una llamada facturaheader con dos campos
Primary Keys (anio,pk) y otra tabla facturadetalle con campos
(anio,factura,producto,cantidad,etc)

una duda es como hago que la tabla detalle en los campos anio,factura
que son pk de la tabla facturaheader sean foreing keys en la tabla detalle.

a la espera de su pronta ayuda

dante

.

Preguntas similares