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

error al crear tablas en mysql 5 modo consola

Estas en el tema de error al crear tablas en mysql 5 modo consola en el foro de Mysql en Foros del Web. hola a todos esoty trabajando en Mysql 5 en modo consola, tengo un problema al crear dos tablas en mi script me marca este error: ...
  #1 (permalink)  
Antiguo 22/06/2010, 20:39
Avatar de guichogdl  
Fecha de Ingreso: abril-2010
Ubicación: gdl
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Pregunta error al crear tablas en mysql 5 modo consola

hola a todos esoty trabajando en Mysql 5 en modo consola, tengo un problema al crear dos tablas en mi script me marca este error:

ERROR 1005 (HY000): Can't create table '.\hotel\facturacliente.frm' (errno: 150)

me lo marca en las dos ultimas tablas ya revise la sintaxis y que este correcta igual las referencias de las llaves foraneas pero nada, todo lo veo bien, estan son las dos tablas del error

/* TABLA FACTURA CLIENTE */
/* TABLA FACTURA SERVICIO */

anexo el script esperando me puedan mencionar porque el del error y como solucionarlo:



/* BASE DE DATOS HOTELES DE MEXICO */

create database hotel;

use hotel

/* TABLA HOTEL */

create table hotel
(id_hotel integer not null,
nombre varchar(35) not null,
direccion varchar(35) not null,
telefono varchar (30) not null,
constraint PK_Hotel primary key(id_hotel));



/* TABLA CLIENTE */

create table cliente
(id_c integer not null,
nombre varchar(35) not null,
apellidos varchar(35) not null,
ciudad varchar(35) not null,
pais varchar(35) not null,
email varchar(35) null,
rfc varchar(35) null,
constraint PK_cliente primary key(id_c));

/* TABLA HABITACION */

create table habitacion
(id_c integer not null,
num_hab integer not null,
tipo_hab varchar (40) not null,
piso integer not null,
estatus varchar(35) not null,
constraint PK_habitacion primary key(num_hab,id_c),
constraint FK_habitacion_idc foreign key(id_c) references cliente(id_c));


/* TABLA RESERVACION */

create table reservacion
(id_reservacion integer not null,
id_c integer not null,
fecha date not null,
cant_hab integer not null,
tipo_hab varchar(35) not null,
dias_reservar integer not null,
observ varchar(35) not null,
constraint PK_reservacion primary key(id_reservacion),
constraint FK_reservacion_tipohab foreign key(tipo_hab) references habitacion(tipo_hab),
constraint FK_reservacion_idc foreign key(id_c) references cliente(id_c));


/* TABLA PROVEEDOR */

create table proveedor
(id_prov integer not null,
nombre varchar(35) not null,
rfc varchar(35) not null,
direccion varchar(35) not null,
telefono varchar(35) not null,
tipo_serv varchar(35) not null,
constraint PK_idprov primary key(id_prov));


/* TABLA REGISTRO DE SERVICIOS */

create table registro_servicios
(id_serv integer not null,
tipo_serv varchar(35) not null,
costo numeric(5,2) not null,
fecha date not null,
cant_pers integer not null,
caract integer not null,
observaciones varchar(50) not null,
constraint PK_registro_servicios primary key(id_serv));


/* TABLA FACTURA CLIENTE */

create table facturacliente
(id_folio integer not null,
id_c integer not null,
rfc varchar(35) null,
tipo_hab varchar (40) not null,
num_hab integer not null,
fecha_salida date not null,
total numeric (8,2) not null,
constraint PK_fact_folio primary key (id_folio),
constraint FK_fact_idc foreign key (id_c) references cliente(id_c),
constraint FK_fact_RFC foreign key (rfc) references cliente(rfc),
constraint FK_fact_tiphab foreign key (tipo_hab) references habitacion(tipo_hab),
constraint FK_fact_nohab foreign key (num_hab) references habitacion(num_hab));


/* TABLA FACTURA SERVICIO */

create table factura_servicio
(id_serv integer not null,
id_c integer not null,
tipo_serv varchar(35) not null,
fecha date not null,
costo numeric(5,2) not null,
constraint Pk_factura_servicio primary key(id_serv),
constraint FK_factura_idserv foreign key (id_serv) references registro_servicios(id_serv),
constraint FK_factura_IDC foreign key (id_c) references cliente(id_c),
constraint FK_factura_tiposerv foreign key (tipo_serv) references registro_servicios(tipo_serv));




gracias de antemano e igual estaria bueno algun comentario sobre como hice mi script para una aplicacion senciila de un hotel (practica)
  #2 (permalink)  
Antiguo 22/06/2010, 22:10
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: error al crear tablas en mysql 5 modo consola

Bueno, el error es bastante simple: Estás declarado FOREIGN KEYs incorrectamente en esa y otras tablas.
Recuerda que una FK es un campo o conjunto de campos que hacen referencia a la PRIMARY KEY de otra tabla. No hacen referencia a ninguna otra cosa que no sea una PK y sólo una PK. Eso significa que no puede haber FK definidas referenciadas a la misma tabla y que pertenezcan a campos que no sean la PK de esa tabla...

En tu caso haces esto:
Código MySQL:
Ver original
  1. CREATE TABLE facturacliente
  2. (id_folio INT not null,
  3. id_c INT not null,
  4. rfc VARCHAR(35) null,
  5. tipo_hab VARCHAR(40) not null,
  6. num_hab INT not null,
  7. fecha_salida DATE not null,
  8. total DECIMAL(8,2) not null,
  9. constraint PK_fact_folio primary key (id_folio),
  10. constraint FK_fact_idc foreign key (id_c) references cliente(id_c),
  11. constraint FK_fact_RFC foreign key (rfc) references cliente(rfc), -- <-- ESTE NO ES PK EN SU TABLA
  12. constraint FK_fact_tiphab foreign key (tipo_hab) references habitacion(tipo_hab), -- <-- ESTE NO ES PK EN SU TABLA
  13. constraint FK_fact_nohab foreign key (num_hab) references habitacion(num_hab) -- <-- ESTE ESTÁ MAL DEFINIDO
  14. );
El último están mal definido porque la PK de origen es de dos campos, y por tanto la FK debe definirse sobre los dos campos al mismo tiempo, y el primero de ambos no existe en esta tabla.
Fuera de eso, las relaciones entre Hotel, Habitación, Cliente y Reserva me paree que estás mal definidas. Especialmente en lo que hace a Hotel y Habitación.

Tip final: NUMERIC no es un tipo nativo de MySQL, pero sí lo reconoce por compatibilidad. Aún así, MySQL convertirá el NUMERIC en DECIMAL, por eso lo cambié directamente.
Cualquier duda consulta el manual de referencia (11. Tipos de columna)
__________________
¿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 22/06/2010, 22:26
Avatar de guichogdl  
Fecha de Ingreso: abril-2010
Ubicación: gdl
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: error al crear tablas en mysql 5 modo consola

muchas gracias por responder, cuando quiero jalar o "heredar" por ejemplo el atributo RFC de la tabla clientes que no es llave primaria en clientes, como puedo jalar los valores de ese atributo a mi tabla de factura?

Tenia entendido que todo atributo que jalabas de otra tabla lo tenias que hacer llave foranea pero creo que estoy mal :S

Dices que las relaciones entre las primeras tablas estan mal definidas?? a que te refieres con eso?? (hotel no la uso para nada porque estoy esperando que me digan si se usara o no) decidi relacionarlas entre si con id_c de clientes para entrar a los datos de cada tabla, pero si no es con ese campo con cual otro lo haria??

y referente a la que dices que la ultima foreign key esta mal definida, como seria la la sentencia para poder jalar tmb ese atributo de la tabla correspondiente siendo que en su tabla comparte la PK con otro campo??

saludos y gracias nuevamente por tu apoyo

Última edición por guichogdl; 22/06/2010 a las 22:32
  #4 (permalink)  
Antiguo 22/06/2010, 22:36
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: error al crear tablas en mysql 5 modo consola

Declarar algo como FK no hace que el valor de la tabla origen se transfiera automáticamente. Eso no existe. Sólo sirve para asegurar la integridad referencial de los datos.
La tarea de poner esos datos en sus respectivas tablas es tuya, en la aplicación, en el mismo modo en que pusiste esos valores en su tabla origen...
Respecto a la sintaxis de una FK que apunta a una PK compuesta de más de un campo, bueno, la solución es obvia: Creas la FK de la misma forma en que definiste la PK... Poniendo los campos implicados en el mismo orden dentro del paréntesis...

Código MySQL:
Ver original
  1. CONSTRAINT FK_fact_nohab FOREIGN key (num_hab, id_c)
  2. REFERENCES habitacion(num_hab, id_c)
Obviamente, para que esto funcione debe existir el campo id_c dentro de la tabl adonde usas la FK.

Pero estos son temas de manual...
¿Por qué no lees mejor el manual para asegurarte de los detalles? Es el mejor consejo, porque sino te la vas a pasar posteando preguntas que salen todas de allí: 13.1.5. Sintaxis de CREATE TABLE
__________________
¿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 22/06/2010, 22:38
Avatar de guichogdl  
Fecha de Ingreso: abril-2010
Ubicación: gdl
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: error al crear tablas en mysql 5 modo consola

ok muchas gracias me quedo mas claro que el agua

saludos
  #6 (permalink)  
Antiguo 22/06/2010, 22:43
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: error al crear tablas en mysql 5 modo consola

Por nada.
Yo, ningún problema para responderte, pero te aconsejo que antes de avanzar más leas el manual en los capítulos que más te importan. Te ahorrará tiempo.

Luego podemos embarcarnos en el tema de las consultas, que es donde se necesita siempre más ayuda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: consola, modo, 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:42.