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

ERROR 1005 al crear la tabla

Estas en el tema de ERROR 1005 al crear la tabla en el foro de Mysql en Foros del Web. Este es mi código. Me da error al intentar crear la tabla actua. ¿Saben porque puede ser? Gracias de antemano. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver ...
  #1 (permalink)  
Antiguo 07/06/2010, 17:49
 
Fecha de Ingreso: junio-2010
Mensajes: 1
Antigüedad: 13 años, 10 meses
Puntos: 0
ERROR 1005 al crear la tabla

Este es mi código. Me da error al intentar crear la tabla actua. ¿Saben porque puede ser? Gracias de antemano.

Código SQL:
Ver original
  1. CREATE DATABASE TOROS;
  2. USE TOROS;
  3.  
  4. CREATE TABLE TORERO
  5. (
  6.  NIF NUMERIC(8) PRIMARY KEY,
  7.  NOMBRE VARCHAR(30),
  8.  APODO VARCHAR(30),
  9.  FECHA_ALT DATE,
  10.  NIF_ALT NUMERIC(8)
  11. );
  12. CREATE TABLE PLAZA
  13. (
  14.  NOMBRE VARCHAR(30) PRIMARY KEY,
  15.  LOCALIDAD VARCHAR(30),
  16.  DIRECCION VARCHAR(30),
  17.  AFORO NUMERIC(4)
  18. );
  19.  
  20. CREATE TABLE CORRIDA
  21. (
  22.  ORDEN NUMERIC(2),
  23.  FERIA VARCHAR(30),
  24.  ANYO DATE,
  25.  NOMBRE_PLAZA VARCHAR(30),
  26.  CONSTRAINT PK_CORRIDA PRIMARY KEY(ORDEN,FERIA,ANYO),
  27.  CONSTRAINT FK_CORRIDA_PLAZA FOREIGN KEY(NOMBRE_PLAZA) REFERENCES PLAZA(NOMBRE)
  28.  );
  29.  
  30. CREATE TABLE ACTUA
  31. (
  32.  ORDEN NUMERIC(2),
  33.  FERIA VARCHAR(30),
  34.  ANYO DATE,
  35.  NIF_TORERO VARCHAR(30),
  36.  PUERTAGRANDE CHAR(1),
  37.  RABOS NUMERIC(1),
  38.  OREJAS NUMERIC(1),
  39.  CONSTRAINT PK_ACTUA PRIMARY KEY(ORDEN,FERIA,ANYO,NIF_TORERO),
  40.  CONSTRAINT FK_ACTUA_C_ORDEN FOREIGN KEY(ORDEN) REFERENCES CORRIDA(ORDEN),
  41.  CONSTRAINT FK_ACTUA_C_FERIA FOREIGN KEY(FERIA) REFERENCES CORRIDA(FERIA),
  42.  CONSTRAINT FK_ACTUA_C_ANYO FOREIGN KEY(ANYO) REFERENCES CORRIDA(ANYO),
  43.  CONSTRAINT FK_ACTUA_TORERO FOREIGN KEY(NIF_TORERO) REFERENCES TORERO(NIF)
  44.  );
  #2 (permalink)  
Antiguo 07/06/2010, 20:02
 
Fecha de Ingreso: mayo-2009
Mensajes: 76
Antigüedad: 15 años
Puntos: 1
Respuesta: ERROR 1005 al crear la tabla

debes reemplazar el tipo de dato NUMERIC por cualquiera de estos tipos que son para mysql
http://dev.mysql.com/doc/refman/5.0/...ric-types.html y al final adicionarle ENGINE=InnoDB;

saludos...
  #3 (permalink)  
Antiguo 07/06/2010, 21:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ERROR 1005 al crear la tabla

Nada que ver.
El problema se da en dos partes:
1) Una FK es un campo o conjunto de campos que referencia a la PK de otra tabla. Eso es básico.
Ahora bien, una PK puede ser un campo único o un conjunto de campos que considerados como unidad, identifican unívocamente un registro en una tabla. El problema es que una FK tiene la misma restricción que la PK: Debe ser declarada sobre el conjunto de campos que compongan también la PK de referncia, y en tu caso estás declarando por separado cada uno de los campos implicados como FK.
Eso no es correcto. La FK es una sola unidad, y debe declararse con los mismos campos, y siendo todos ellos del mismo tipo de columna y en el mismo orden... Por eso falla.

2) También falla porque para poder relacionar un campo como FK con una PK, ambos deben ser del mismo tipo de datos, rango e inclusive CHARSET. No debe haber diferencia entre ellos, porque si no uno de ellos podría aceptar más valores que el otro, o bien no se podrían emparejar por contener diferentes códigos para el mismo caracter.
En tu caso, los campos NIF y NIF_TORERO son de tipo diferente, uno es VARCHAR y el otro NUMERIC. Eso es un error.

¿Se comprende la idea?

El script quedaría más o menos así:
Código MySQL:
Ver original
  1. USE TOROS;
  2.  
  3. CREATE TABLE TORERO
  4. (
  5.  NOMBRE VARCHAR(30),
  6.  APODO VARCHAR(30),
  7.  FECHA_ALT DATE,
  8.  NIF_ALT NUMERIC(8)
  9. );
  10. (
  11.  NOMBRE VARCHAR(30) PRIMARY KEY,
  12.  LOCALIDAD VARCHAR(30),
  13.  DIRECCION VARCHAR(30),
  14.  AFORO NUMERIC(4)
  15. );
  16.  
  17. CREATE TABLE CORRIDA
  18. (
  19.  ORDEN NUMERIC(2),
  20.  FERIA VARCHAR(30),
  21.  ANYO DATE,
  22.  NOMBRE_PLAZA VARCHAR(30),
  23.  CONSTRAINT PK_CORRIDA PRIMARY KEY(ORDEN,FERIA,ANYO),
  24.  CONSTRAINT FK_CORRIDA_PLAZA FOREIGN KEY(NOMBRE_PLAZA) REFERENCES PLAZA(NOMBRE)
  25.  );
  26.  
  27. CREATE TABLE  `ACTUA` (
  28.   `ORDEN` decimal(2,0) NOT NULL default '0',
  29.   `FERIA` varchar(30) NOT NULL default '',
  30.   `ANYO` date NOT NULL default '0000-00-00',
  31.   `NIF_TORERO` int(10) unsigned NOT NULL,
  32.   `PUERTAGRANDE` char(1) default NULL,
  33.   `RABOS` decimal(1,0) default NULL,
  34.   `OREJAS` decimal(1,0) default NULL,
  35.   PRIMARY KEY  (`ORDEN`,`FERIA`,`ANYO`,`NIF_TORERO`),
  36.   KEY `FK_ACTUA_TORERO` (`NIF_TORERO`),
  37.   CONSTRAINT `FK_ACTUA_TORERO` FOREIGN KEY (`NIF_TORERO`) REFERENCES `torero` (`NIF`),
  38.   CONSTRAINT `FK_ACTUA_C_ORDEN` FOREIGN KEY (`ORDEN`, `FERIA`, `ANYO`) REFERENCES `corrida` (`ORDEN`, `FERIA`, `ANYO`)

Usé MySQL Query Browser para corregir la tabla, de allí la diferencia de escritura.

Detalles:
- Es conveniente usar tipos nativos de MySQL para la los scripts de creación de tablas, por cuanto sino MySQL hará una conversión implícita. Si no quieres hacerlo por cuestión de costumbre o de portabilidad, lo que debes hacer es usar el tipo no nativo cuya conversión sea más cercana a la realidad.
Para darte un ejemplo, NUMERIC no es sinónimo de INTEGER, sino de DECIMAL, con lo que crearás una PK con punto flotante... que no tiene ningún sentido. Nadie escribe en decimales el identificador de un exprediente, por ejemplo. En ese caso corresponde SMALLINT, MEDIUMINT, INT, o BIGINT.
Consulta los tipos de columna en el manual: MYSQL::11. Tipos de columna.

- En los identificadores de tipo numérico, usa UNSIGNED donde puedas. Te permite el doble de rango, y además no existen números negativos en los expedientes, como te imaginarás.

- En los nombres de objetos de bases de datos (tablas, bases, columnas, etc.), ten en cuenta que usarlos con mayúsculas te puede dar problemas de portabilidad de código, porque si la base se instala en un servidor basado en Linux, los sistemas de ese tipo son sensibles a MAYUSCULAS/minúsculas, lo que puede dar resultados erráticos en la programación. Es preferible usar minúsculas (de todos modos, MySQL te convierte los nombres de las tablas y bases a minúsculas por default).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 17/03/2011, 15:24
 
Fecha de Ingreso: enero-2011
Ubicación: Calle 1 No 11-07 Rivera-Huila
Mensajes: 1
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: ERROR 1005 al crear la tabla

Todavía quedan vacíos y se puede usar el complemento

Etiquetas: tablas
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 04:22.