Como puedo poner un campo que sea clave primaria y foránea a la vez.
Muchas gracias
| |||
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 |
| ||||
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 Pero la forma más correcta de la PK sería:
Código MySQL:
Ver original
__________________ ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente... "El problema es la interfase silla-teclado." (Gillermo Luque) |
| |||
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: |