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

claves primaria y foranea

Estas en el tema de claves primaria y foranea en el foro de Mysql en Foros del Web. Como puedo poner un campo que sea clave primaria y foránea a la vez. Muchas gracias...
  #1 (permalink)  
Antiguo 26/04/2010, 05:10
 
Fecha de Ingreso: abril-2010
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
claves primaria y foranea

Como puedo poner un campo que sea clave primaria y foránea a la vez.

Muchas gracias
  #2 (permalink)  
Antiguo 26/04/2010, 05:41
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 primaria y foranea

Declarándolo como PK y también referenciandolo a la PK de otra tabla, la cual a su vez debe existir previamente.

Es algo de manual.

¿Cuál es exactamente el problema que te plantea?
__________________
¿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 27/04/2010, 01:49
 
Fecha de Ingreso: abril-2010
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: claves primaria y foranea

CREATE TABLE EXPERIENCIA (IDEXPERIENCIA INT (4) NOT NULL AUTO_INCREMENT,
IDPERSONA INTEGER (4), CATEGORIA VARCHAR (30),
EMPRESA VARCHAR (30),
INICIO DATE, FIN DATE,
DURACION MESES VARCHAR (3),
FUNCIONES VARCHAR (100),
PRIMARY KEY (IDEXPERIENCIA, IDPERSONA),
FOREIGN KEY (IDPERSONA) REFERENCES DATOSPERSONALES (IDPERSONA));

CREATE TABLE DATOSPERSONALES(IDPERSONA INT (4) NOT NULL AUTO_INCREMENT,
NOMBRE VARCHAR(20),
APELLIDOS VARCHAR(40),
DNI VARCHAR(9),
TELEFONO VARCHAR(9),
MOVIL VARCHAR(9),
EMAIL VARCHAR(50),
DIRECCION VARCHAR(50),
POBLACION VARCHAR(30),
PROVINCIA VARCHAR(30),
CP VARCHAR(5),
CARNET VARCHAR(4),
VEHICULOPROPIO VARCHAR(2),
FOTO VARCHAR(100),
PRIMARY KEY (IDPERSONA));

El problema es que IDPERSONA es a la vez primaria y foranea de otra tabla, tal como esta puesto no me funciona.

Muchas gracias
  #4 (permalink)  
Antiguo 27/04/2010, 06:07
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 primaria y foranea

Normalmente, cuando pones un campo AUTO_INCREMENT, éste por sí mismo es PK, y no requiere de más para establecer la unicidad. No te olvides que jamás habrá, en ese contexto, dos registros cuyo ID sea el mismo, pero sí habrá (en tu caso) dos registros con el mismo idpersona, ya que el idexperiencia siempre cambiará. En ese sentido, la tabla está mal definida.
¿Se entiende la idea?
Técnicamente, si el registro de experiencia es único por persona, no requiere un id propio. con solamente la FK como PK alcanzaría.
Pero en el caso de que experiencia pueda tener más de un registro relacionado con cada persona, si requeriría una PK propia, que bien puede no ser numérica.

De todos modos, si aún así quieres poner ambos campos como PK, entonces el tipo de índice creado debe ser confeccionado de otra forma (BTREE), por lo que hay que indicarlo.
Además, la FK, tal como la pones debería de tener otra forma, y ser creada después de crear la tabla persona y no antes.

La idea sería:
Código MySQL:
Ver original
  1. CREATE TABLE  `datospersonales` (
  2.   `IDPERSONA` int(4) NOT NULL auto_increment,
  3.   `NOMBRE` varchar(20) default NULL,
  4.   `APELLIDOS` varchar(40) default NULL,
  5.   `DNI` varchar(9) default NULL,
  6.   `TELEFONO` varchar(9) default NULL,
  7.   `MOVIL` varchar(9) default NULL,
  8.   `EMAIL` varchar(50) default NULL,
  9.   `DIRECCION` varchar(50) default NULL,
  10.   `POBLACION` varchar(30) default NULL,
  11.   `PROVINCIA` varchar(30) default NULL,
  12.   `CP` varchar(5) default NULL,
  13.   `CARNET` varchar(4) default NULL,
  14.   `VEHICULOPROPIO` varchar(2) default NULL,
  15.   `FOTO` varchar(100) default NULL,
  16.   PRIMARY KEY  (`IDPERSONA`)
  17.  
  18. CREATE TABLE  `experiencia` (
  19.   `IDEXPERIENCIA` int(4) NOT NULL auto_increment,
  20.   `IDPERSONA` int(4) NOT NULL,
  21.   `CATEGORIA` varchar(30) default NULL,
  22.   `EMPRESA` varchar(30) default NULL,
  23.   `INICIO` date default NULL,
  24.   `FIN` date default NULL,
  25.   `DURACION_MESES` varchar(3) default NULL,
  26.   `FUNCIONES` varchar(100) default NULL,
  27.   PRIMARY KEY  USING BTREE (`IDEXPERIENCIA`,`IDPERSONA`),
  28.   CONSTRAINT `FK_experiencia` FOREIGN KEY (`IDEXPERIENCIA`) REFERENCES `experiencia` (`IDEXPERIENCIA`)

Pero la forma más correcta de la PK sería:

Código MySQL:
Ver original
  1. CREATE TABLE  `datospersonales` (
  2.   `IDPERSONA` int(4) NOT NULL auto_increment,
  3.   `NOMBRE` varchar(20) default NULL,
  4.   `APELLIDOS` varchar(40) default NULL,
  5.   `DNI` varchar(9) default NULL,
  6.   `TELEFONO` varchar(9) default NULL,
  7.   `MOVIL` varchar(9) default NULL,
  8.   `EMAIL` varchar(50) default NULL,
  9.   `DIRECCION` varchar(50) default NULL,
  10.   `POBLACION` varchar(30) default NULL,
  11.   `PROVINCIA` varchar(30) default NULL,
  12.   `CP` varchar(5) default NULL,
  13.   `CARNET` varchar(4) default NULL,
  14.   `VEHICULOPROPIO` varchar(2) default NULL,
  15.   `FOTO` varchar(100) default NULL,
  16.   PRIMARY KEY  (`IDPERSONA`)
  17.  
  18. CREATE TABLE  `experiencia` (
  19.   `IDEXPERIENCIA` int(4) NOT NULL auto_increment PRIMARY KEY ,
  20.   `IDPERSONA` int(4) NOT NULL,
  21.   `CATEGORIA` varchar(30) default NULL,
  22.   `EMPRESA` varchar(30) default NULL,
  23.   `INICIO` date default NULL,
  24.   `FIN` date default NULL,
  25.   `DURACION_MESES` varchar(3) default NULL,
  26.   `FUNCIONES` varchar(100) default NULL,
  27.   CONSTRAINT `FK_experiencia` FOREIGN KEY (`IDEXPERIENCIA`) REFERENCES `experiencia` (`IDEXPERIENCIA`)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/04/2010, 02:31
 
Fecha de Ingreso: abril-2010
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: claves primaria y foranea

Al final ha quedado así y no me da fallos por ningun sitio, solo me keda probrar la insercion de datos, borrarlos y probar bien las tablas por si hubiera algun error.

Si ves algo que se me puediera haber pasado, dimelo por favor.

Gracias.


CREATE DATABASE CURRICULUM;
USE CURRICULUM;
CREATE TABLE DATOSPERSONALES(IDPERSONA INT(4) PRIMARY KEY AUTO_INCREMENT,
NOMBRE VARCHAR(20),
APELLIDOS VARCHAR(40),
DNI VARCHAR(9),
TELEFONO VARCHAR(9),
MOVIL VARCHAR(9),
EMAIL VARCHAR(50),
DIRECCION VARCHAR(50),
POBLACION VARCHAR(30),
PROVINCIA VARCHAR(30),
CP VARCHAR(5),
CARNET VARCHAR(4),
VEHICULOPROPIO VARCHAR(2),
FOTO VARCHAR(100));



CREATE TABLE OTROSDATOS(IDOTROS INT(4) PRIMARY KEY AUTO_INCREMENT,
IDPERSONA INT(4),
DISPONIHORARIA VARCHAR(20),
DISPONIGEOG VARCHAR(20),
INCORPORACION VARCHAR(20),
OTROS VARCHAR(150),
FOREIGN KEY(IDPERSONA) REFERENCES DATOSPERSONALES(IDPERSONA) ON DELETE CASCADE ON UPDATE CASCADE);




CREATE TABLE FORMACIONINICIALCOMPLEMENTARIA(IDTITULO VARCHAR(50), PRIMARY KEY(IDTITULO));




CREATE TABLE FORMACIONCOMPLEMENTARIA(IDFORMACION INT(4) AUTO_INCREMENT,
IDPERSONA INTEGER,
IDTITULO VARCHAR(50),
HORAS VARCHAR(4),
ANIO VARCHAR(4),
ENTIDAD VARCHAR(50),
PRIMARY KEY(IDFORMACION,IDPERSONA),
FOREIGN KEY (IDTITULO) REFERENCES FORMACIONINICIALCOMPLEMENTARIA(IDTITULO) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (IDPERSONA) REFERENCES DATOSPERSONALES(IDPERSONA) ON DELETE CASCADE ON UPDATE CASCADE);




CREATE TABLE CONOCIMIENTOSINFORMATICOS(IDCONOCIMIENTOS VARCHAR (30),
IDPERSONA INT(4),
PRIMARY KEY(IDCONOCIMIENTOS),
FOREIGN KEY(IDPERSONA) REFERENCES DATOSPERSONALES(IDPERSONA)ON DELETE CASCADE ON UPDATE CASCADE);





CREATE TABLE FORMACIONINICIAL(ESPECIALIDAD VARCHAR (50),
PRIMARY KEY (ESPECIALIDAD));




CREATE TABLE FORMACIONACADEMICA ( IDFORMACION INT (4) NOT NULL AUTO_INCREMENT,
IDPERSONA INTEGER,
ESPECIALIDAD VARCHAR (50),
NIVEL VARCHAR (20),
ANIO VARCHAR (4),
CENTRO VARCHAR (30),
PRIMARY KEY (IDFORMACION, IDPERSONA),
FOREIGN KEY (IDPERSONA) REFERENCES DATOSPERSONALES (IDPERSONA)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (ESPECIALIDAD) REFERENCES FORMACIONINICIAL(ESPECIALIDAD)
ON DELETE CASCADE ON UPDATE CASCADE);




CREATE TABLE EXPERIENCIA (IDEXPERIENCIA INT(4) NOT NULL AUTO_INCREMENT,
IDPERSONA INTEGER,
CATEGORIA VARCHAR (30),
EMPRESA VARCHAR (30),
INICIO DATE,
FIN DATE,
DURACIONMESES VARCHAR (3),
FUNCIONES VARCHAR (100),
PRIMARY kEY (IDEXPERIENCIA, IDPERSONA),
FOREIGN KEY (IDPERSONA) REFERENCES DATOSPERSONALES(IDPERSONA) ON DELETE CASCADE
ON UPDATE CASCADE);

Etiquetas: claves, primaria, foreignkey
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 23:05.