Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Claves Ajenas y primarias.

Estas en el tema de Claves Ajenas y primarias. en el foro de Oracle en Foros del Web. Hola buenas, estoy algo liado con las claves primarias y ajenas. Yo tengo entendido que cada tabla tiene que tener 1 clave primaria. Y las ...
  #1 (permalink)  
Antiguo 09/03/2013, 16:24
 
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 11 meses
Puntos: 0
Claves Ajenas y primarias.

Hola buenas, estoy algo liado con las claves primarias y ajenas.
Yo tengo entendido que cada tabla tiene que tener 1 clave primaria.

Y las claves ajenas son para relacionar las tablas.
Entonces yo que estoy estudiando esto, tengo dudas xddd..

Miren las claves primarias:
Código:
ALTER TABLE alojamiento 
ADD CONSTRAINT alojamiento_Cod_Alojamiento_pk primary key(Cod_Alojamiento);

ALTER TABLE alservicio
ADD CONSTRAINT alservicio_Cod_Alojamiento_pk primary key(Cod_Alojamiento);

ALTER TABLE clientes 
ADD CONSTRAINT clientes_Num_cliente_pk primary key(Num_cliente);  

ALTER TABLE contrato 
ADD CONSTRAINT contrato_Num_contrato_pk primary key(Num_contrato);

ALTER TABLE empleados 
ADD CONSTRAINT empleados_Cod_Empleado_pk primary key(Cod_Empleado);  

ALTER TABLE transporte 
ADD CONSTRAINT transporte_Cod_Transporte_pk primary key(Cod_Transporte);  

ALTER TABLE tipotrans 
ADD CONSTRAINT tipotrans_Cod_Transporte_pk primary key(Cod_Transporte);
Y estas son las ajenas:
Código:
ALTER TABLE clientes
ADD CONSTRAINT clientes_Num_cliente_fk foreign key (Num_cliente)
References contrato(Num_cliente);

ALTER TABLE empleados
ADD CONSTRAINT empleados_Cod_Empleado_fk foreign key (Cod_Empleado)
References contrato(Cod_Empleado);

ALTER TABLE contrato
ADD CONSTRAINT contrato_Num_contrato_fk foreign key (Num_contrato)
References transporte(Num_contrato);

ALTER TABLE contrato
ADD CONSTRAINT contrato_Num_contrato_fk foreign key (Num_contrato)
References alojamiento(Num_contrato);

ALTER TABLE alojamiento
ADD CONSTRAINT alojamiento_Cod_Alojamiento_fk foreign key (Cod_Alojamiento)
References alservicios(Cod_Alojamiento);

ALTER TABLE clientes
ADD CONSTRAINT clientes_Cod_Alojamiento_fk foreign key (Cod_Alojamiento)
References alojamiento(Cod_Alojamiento);
ALTER TABLE clientes
ADD CONSTRAINT clientes_Fecha_A_Inicio_fk foreign key (Fecha_A_Inicio)
References alojamiento(FechaInicio);
ALTER TABLE clientes
ADD CONSTRAINT clientes_Fecha_A_Fin_fk foreign key (Fecha_A_Fin)
References alojamiento(FechaFin);
ALTER TABLE clientes
ADD CONSTRAINT clientes_Cod_Transporte_fk foreign key (Cod_Transporte)
References transporte(Cod_Transporte);
ALTER TABLE clientes
ADD CONSTRAINT clientes_Fecha_T_Inicio_fk foreign key (Fecha_T_Inicio)
References transporte(Fecha_Inicio);
ALTER TABLE clientes
ADD CONSTRAINT clientes_Fecha_T_Fin_fk foreign key (Fecha_T_Fin)
References transporte(Fecha_Fin);
Pero me da error ORA-02270.
¿Todas las relaciones tienen que tener 1 clave primaria? Si es asi, ¿Las relaciones con clave primaria son 1:1? ¿Como las hago 1:N? ¿Y las N:M?

Estructura de la bd por si interesa:
Código:
--CREATE_TABLE
CREATE TABLE alojamiento (
  Cod_Alojamiento decimal(10,0) NOT NULL,
  Num_Contrato decimal(10,0) DEFAULT NULL,
  FechaInicio date DEFAULT NULL,
  FechaFin date DEFAULT NULL,
  Tipo_Habitación varchar(20) DEFAULT NULL,
  Comida varchar(20) DEFAULT NULL);
CREATE TABLE alservicio (
  Cod_Alojamiento decimal(10,0) DEFAULT NULL,
  Tipo_Servicio varchar(20) DEFAULT NULL,
  Fecha_Hora_Servicio date DEFAULT NULL);
CREATE TABLE clientes (
  Num_cliente decimal(10,0) NOT NULL,
  Nombre varchar(20) DEFAULT NULL,
  Apellido varchar(20) DEFAULT NULL,
  DNI varchar(20) DEFAULT NULL,
  DetallesPago varchar(20) DEFAULT NULL,
  Cod_Alojamiento decimal(10,0) DEFAULT NULL,
  Fecha_A_Inicio date DEFAULT NULL,
  Fecha_A_Fin date DEFAULT NULL,
  Cod_Transporte decimal(10,0) DEFAULT NULL,
  Fecha_T_Inicio date DEFAULT NULL,
  Fecha_T_Fin date DEFAULT NULL);
CREATE TABLE contrato (
  Num_contrato decimal(10,0) NOT NULL,
  Num_cliente decimal(10,0) DEFAULT NULL,
  Fecha_Realización date DEFAULT NULL,
  Cod_Empleado decimal(10,0) DEFAULT NULL);
CREATE TABLE empleados (
  Cod_Empleado decimal(10,0) NOT NULL,
  Nombre varchar(20) DEFAULT NULL,
  Apellidos varchar(20) DEFAULT NULL,
  DNI varchar(20) DEFAULT NULL,
  hiredate date DEFAULT NULL,
  loc varchar(20) DEFAULT NULL);
CREATE TABLE tipotrans (
  Cod_Transporte decimal(10,0) DEFAULT NULL,
  Tipo varchar(20) DEFAULT NULL);
CREATE TABLE transporte (
  Cod_Transporte decimal(10,0) NOT NULL,
  Num_contrato decimal(10,0) DEFAULT NULL,
  Fecha_Inicio date DEFAULT NULL,
  Fecha_Fin date DEFAULT NULL);
Gracias, espero debate
  #2 (permalink)  
Antiguo 09/03/2013, 19:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Claves Ajenas y primarias.

1) Toda tabla debe tener una PK.
2) Toda relación entre dos tablas crea una FK.
3) Toda FK apunta únicamente a una PK de otra tabla, y sólo a la PK de esa tabla.
4) Toda relación N:N entre dos tablas crea una tabla adicional, la cual tiene por PK las FK de ambas tablas (apunta cada FK a su tabla correspondiente)

Esto aparece en cualquier manual o tutorial de Fundamentos de Bases de Datos Relacionales, incluyendo Wikipedia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/03/2013, 13:21
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Claves Ajenas y primarias.

Ademas de lo dicho por gnzsoloyo, toda FK debe tener un índice que contenga los campos de la FK en la tabla origen ya que si no, cuando modifiquemos cualquier registro de la tabla a la que apunta la FK se bloquearán todos los registros de la tabla origen de la FK.

Un saludo.
__________________
Anotaciones de un programador

Etiquetas: claves, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:40.