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

Me da error 1005 al crear una tabla y no puedo solucionarlo

Estas en el tema de Me da error 1005 al crear una tabla y no puedo solucionarlo en el foro de Mysql en Foros del Web. el error es por clave foranea pero por mas que he mirado no he conseguido arreglarlo, os dejo la base de datos entera, es algo ...
  #1 (permalink)  
Antiguo 12/05/2010, 10:27
 
Fecha de Ingreso: junio-2009
Mensajes: 103
Antigüedad: 14 años, 10 meses
Puntos: 0
Me da error 1005 al crear una tabla y no puedo solucionarlo

el error es por clave foranea pero por mas que he mirado no he conseguido arreglarlo, os dejo la base de datos entera, es algo peque;o.... Por cierto el error se da en la tabla 'compra', el resto de tablas y las inserciones del final si se ejecutan bien:


CREATE DATABASE proyecto;
use proyecto;



/* TABLAS */

create table componente
(
nombrecomponente varchar(30) PRIMARY KEY
)engine=innodb;

create table categoria
(
nombrecategoria varchar(30) PRIMARY KEY
)engine=innodb;

create table articulo
(
nomarticulo varchar(30) NOT NULL,
nombrecomponente varchar(30) NOT NULL,
nombrecategoria varchar(30) NOT NULL,
marca varchar(25) NOT NULL,
precio float(9) NOT NULL,
descripcion varchar(250) NOT NULL,
primary key (nombrecomponente,nombrecategoria,marca,nomarticul o),
foreign key (nombrecomponente) references componente (nombrecomponente),
foreign key (nombrecategoria) references categoria (nombrecategoria)
)engine=innodb;

CREATE TABLE usuario
(
login varchar(30) primary key,
password varchar(30) NOT NULL,
privilegio varchar(15)NOT NULL
)engine=innodb;

create table compra
(
fecha datetime,
nomarticulo varchar(30),
login varchar(30),
primary key(nomarticulo,login,fecha),
foreign key(nomarticulo) references articulo(nomarticulo),
foreign key(login) references usuario (login)
)engine=innodb;

/* INSERCION */

INSERT INTO usuario VALUES('admin','xd','si');
INSERT INTO usuario VALUES('user','xd','no');
  #2 (permalink)  
Antiguo 12/05/2010, 10:53
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, 4 meses
Puntos: 2658
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

Tenías dos errores:
1) Había un espacio entremedio de un nombre de campo en una FK.
2) Estabas definiendo una PK multicampo en ARTICULO, que no la necesita tan larga, y luego en COMPRA declarabas una FK hacia ARTICULO usando un sólo campo. Una FK es un campo o conjunto de campos que apunta a una PK de otra tabla. A toda la PK; si la misma tiene más de un campo, todos ellos deben estar reflejados en la tabla que la use de FK.
Código MySQL:
Ver original
  1. CREATE DATABASE proyecto;
  2. use proyecto;
  3.  
  4. /* TABLAS */
  5.  
  6. create table componente
  7. (
  8. nombrecomponente varchar(30) PRIMARY KEY
  9.  
  10. create table categoria
  11. (
  12. nombrecategoria varchar(30) PRIMARY KEY
  13.  
  14. create table articulo
  15. (
  16. nomarticulo varchar(30) NOT NULL,
  17. nombrecomponente varchar(30) NOT NULL,
  18. nombrecategoria varchar(30) NOT NULL,
  19. marca varchar(25) NOT NULL,
  20. precio float(9) NOT NULL,
  21. descripcion varchar(250) NOT NULL,
  22. primary key (nomarticulo),
  23. foreign key (nombrecomponente) references componente (nombrecomponente),
  24. foreign key (nombrecategoria) references categoria (nombrecategoria)
  25.  
  26. CREATE TABLE usuario
  27. (
  28. login varchar(30) primary key,
  29. privilegio varchar(15)NOT NULL
  30.  
  31. create table compra
  32. (
  33. fecha datetime,
  34. nomarticulo varchar(30),
  35. login varchar(30),
  36. primary key(nomarticulo,login,fecha),
  37. foreign key(nomarticulo) references articulo(nomarticulo),
  38. foreign key(login) references usuario(login)
  39.  
  40. /* INSERCION */
  41.  
  42. INSERT INTO usuario VALUES('admin','xd','si');
  43. INSERT INTO usuario VALUES('user','xd','no');
__________________
¿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 12/05/2010, 12:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

Lo que pasa es que en la tabla compra cuando haces una foreign key a la tabla articulo, solo pides un solo campo, cuando la primary key de esa tabla está compuesta por 4 campos.

Esto no es posible.
Tendrías que hacer la foreign key con 4 campos para que te permita hacer la llave.

EDITO: Deje abierto el post y me fui a almorzar. gnzsoloyo respondió hace rato

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 12/05/2010, 17:13
 
Fecha de Ingreso: junio-2009
Mensajes: 103
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

claro pero yo quiero que tenga todas esas claves primarias para que no se repita ningun articulo, me explico;

create table articulo
(
nomarticulo varchar(30) NOT NULL,
nombrecomponente varchar(30) NOT NULL,
nombrecategoria varchar(30) NOT NULL,
marca varchar(25) NOT NULL,
precio float(9) NOT NULL,
descripcion varchar(250) NOT NULL,
primary key (nomarticulo,nombrecomponente,nombrecategoria,marc a),
foreign key (nombrecomponente) references componente (nombrecomponente),
foreign key (nombrecategoria) references categoria (nombrecategoria)
)engine=innodb;

marca: HP
nombrecategoria: Impresora
Nombrecomponente: Perifericos
nomarticulo: G4506

quiero que por ejemplo exista una sola impresora de la marca HP cuyo nomarticulo o modelo sea G4506 y pertenezca a la categoria de impresora, es por eso que la clave la he echo tan larga, porque no quiero duplicidad.... de todas formas admito ideas, por si se podria hacer de otra forma mas corta
  #5 (permalink)  
Antiguo 12/05/2010, 17:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

Te recomiendo crear otro campo como identificador en la tabla y configurarlo como primary key.
saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 13/05/2010, 15:52
 
Fecha de Ingreso: junio-2009
Mensajes: 103
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

Cita:
Iniciado por huesos52 Ver Mensaje
Te recomiendo crear otro campo como identificador en la tabla y configurarlo como primary key.
saludos
pero si hicieses eso stamos en las mismas, se pueden repetir los articulos y eso es lo k kiero evitar
  #7 (permalink)  
Antiguo 13/05/2010, 15:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

La forma como quieres manejar las relaciones es incorrecta veronica.
Si tienes un campo autoincrementable, los registros van a poder diferenciarse unos de otros. Ahora bien, si el nombre del producto es único, existe un tipo de constraint llamado UNIQUE y no necesariamente tienes que enredarte la vida haciendolo primario.

la forma de hacerlo unico es:
Código SQL:
Ver original
  1. UNIQUE KEY(campo)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 15/05/2010, 10:37
 
Fecha de Ingreso: junio-2009
Mensajes: 103
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Me da error 1005 al crear una tabla y no puedo solucionarlo

aaaaaaaa pues ese dato no lo conocia!! te doy mil gracias por kitarme la duda!!

duda resuelta

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 01:35.