Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/04/2010, 06:07
Avatar de gnzsoloyo
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)