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

Porque no me deja crear estas tablas

Estas en el tema de Porque no me deja crear estas tablas en el foro de Mysql en Foros del Web. no se que pasa, porque no me deja crear la segunda tabla, la primera se crea sin ningun problema pero la segunda me dice que ...
  #1 (permalink)  
Antiguo 30/01/2013, 14:16
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Porque no me deja crear estas tablas

no se que pasa, porque no me deja crear la segunda tabla, la primera se crea sin ningun problema pero la segunda me dice que error 1005 can't create table (no se puede crear esta tabla)

Tabla 1

Código:
create table factura(
nofactura varchar(15) not null,
ingresacopia varchar(2) not null,
fechafactura date not null,
subtotal int(15) not null,
iva int(15) not null,
descripcion varchar(100) not null,
proyectocontrato varchar(100) not null,
cliente varchar(70) not null,
observaciones varchar(80) not null,
primary key(nofactura)
);
Tabla 2

Código:
create table contratos(
contrato varchar(70) not null,
valorcontrato int(40) not null,
cliente varchar(70) not null,
factura varchar(15) not null,
valorfactura int(15) not null,
total int (30) not null,
primary key(contrato),
foreign key(factura)
references factura(nofactura),
foreign key(valorfactura)
references factura(subtotal)
);
  #2 (permalink)  
Antiguo 30/01/2013, 14:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Porque no me deja crear estas tablas

Hola andres_15_:

Conviene que le des una revisada al manual de MySQL para el tema de Llaves foráneas...

http://dev.mysql.com/doc/refman/5.0/...nstraints.html

Cita:
Hay que tener cuidado en cómo defines los índices...
En la página existen ejemplos de cómo de deben crear los índices de la tabla principal y cómo se deben crear los índices de la tabla que los va a referenciar... insisto otra vez PON ESPECIAL ATENCIÓN AL EJEMPLO DONDE UTILIZAN LLAVES CON MÁS DE UN CAMPO REFERENCIADO.


Cita:
Aquí, un ejemplo más complejo, en el cual una tabla product_order tiene claves foráneas hacia otras dos tablas. Una de las claves foráneas hace referencia a un índice de dos columnas en la tabla product. La otra hace referencia a un índice de una sola columna en la tabla customer:
Saludos
Leo:
  #3 (permalink)  
Antiguo 30/01/2013, 14:56
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Porque no me deja crear estas tablas

Hola,

te recomiendo que, las PK y las FK las crees mediante alter table, tras crear la tabla.

Concretamente, la relación que te falla es la FK entre valorfactura y subtotal.

Para solucionarlo, crea el siguiente índice:

Código MySQL:
Ver original
  1. create unique index idx_subtotal on factura(subtotal);

Posteriormente ejecuta el alter table:

Código MySQL:
Ver original
  1. ALTER TABLE Contratos ADD CONSTRAINT FK_TOTAL FOREIGN KEY (valorfactura) REFERENCES factura(subtotal);

Saludos.
  #4 (permalink)  
Antiguo 30/01/2013, 15:03
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: Porque no me deja crear estas tablas

Un campo "subtotal" no puede ser un campo UNIQUE en una factura. Eso no tiene sentido.
Es imposible que puedas pretender que un valor como ese sea único entre todas las facturas posibles.
La cosa tiene dos errores:
1) No es necesario un concepto de "subtotal", porque eso es un dato calculable, y por regla del modelo, los datos calculables no se almacenan.
2) No puedes pretender crear una FK contra un campo no clave. MySQL Admite sólo las PK (definición del modelo) y los UNIQUE, que fungen de claves candidatas. Y ese campo no cumple con ninguna.

Además, resulta bastante incorrecto usar un VARCHAR como campo donde almacenes el numero de factura. Incluso si se usaran códigos alfanuméricos para las facturas, ese diseño no es correcto.

En definitiva, es un modelo de datos defectuoso.
__________________
¿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 30/01/2013, 16:03
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: Porque no me deja crear estas tablas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Un campo "subtotal" no puede ser un campo UNIQUE en una factura. Eso no tiene sentido.
Es imposible que puedas pretender que un valor como ese sea único entre todas las facturas posibles.
La cosa tiene dos errores:
1) No es necesario un concepto de "subtotal", porque eso es un dato calculable, y por regla del modelo, los datos calculables no se almacenan.
2) No puedes pretender crear una FK contra un campo no clave. MySQL Admite sólo las PK (definición del modelo) y los UNIQUE, que fungen de claves candidatas. Y ese campo no cumple con ninguna.

Además, resulta bastante incorrecto usar un VARCHAR como campo donde almacenes el numero de factura. Incluso si se usaran códigos alfanuméricos para las facturas, ese diseño no es correcto.

En definitiva, es un modelo de datos defectuoso.
es evidente que tengo muchos problemas pero he tratado de arreglarlo asi:

Tabla 1 nofactura PK(lo almaceno como varchar porque en ocasiones el int me da problemas)
Totalfactura int PK

Tabla2 Contrato Varchar,valorcontrato int

Tabla 3 nofactura,Totalfactura,Contrato,valorcontrato,tota l

En la tabla 3 quiero que todos excepto el total sean foranes ¿Se puede? y lo trate de hacer y coloque : foreign key(nofactura)references tabla1(nofactura)
Y me dio correcto, pero al hacer lo mismo con totalfactura me salio un errorsote que jamas habia visto
Código:
Can't create table 'facturas.#sql-94c_d6' (errno: 150)
  #6 (permalink)  
Antiguo 01/02/2013, 12:12
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Porque no me deja crear estas tablas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Un campo "subtotal" no puede ser un campo UNIQUE en una factura. Eso no tiene sentido.
Es imposible que puedas pretender que un valor como ese sea único entre todas las facturas posibles.
La cosa tiene dos errores:
1) No es necesario un concepto de "subtotal", porque eso es un dato calculable, y por regla del modelo, los datos calculables no se almacenan.
2) No puedes pretender crear una FK contra un campo no clave. MySQL Admite sólo las PK (definición del modelo) y los UNIQUE, que fungen de claves candidatas. Y ese campo no cumple con ninguna.

Además, resulta bastante incorrecto usar un VARCHAR como campo donde almacenes el numero de factura. Incluso si se usaran códigos alfanuméricos para las facturas, ese diseño no es correcto.

En definitiva, es un modelo de datos defectuoso.
Estoy de acuerdo contigo, ya que, realmente, yo no quiero que el campo sea único. Sólo le he comentado la forma de solucionar su problema. Eso no quita que exista un problema de diseño de la BD. Toda BD referencial debe ir por PK y ese campo, obviamente, no lo es.

Saludos.
  #7 (permalink)  
Antiguo 01/02/2013, 12:45
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: Porque no me deja crear estas tablas

Cita:
Tabla 1 nofactura PK(lo almaceno como varchar porque en ocasiones el int me da problemas)
Totalfactura int PK
Si el INT te da problemas, es que lo estás manejando mal, pero eso no justifica aplicar parches que lo único que lograrán es introducir defectos y fallas de consistencia.
Cita:
En la tabla 3 quiero que todos excepto el total sean foranes ¿Se puede? y lo trate de hacer y coloque : foreign key(nofactura)references tabla1(nofactura)
Y me dio correcto, pero al hacer lo mismo con totalfactura me salio un errorsote que jamas habia visto
No puedes hacer que todo sea FK sin que cada una de los campos sea PK...
Eso es simple y sencillamente imposible, sin contar que en tu caso es absurdo e innecesario.
En el supuesto caso que pudiera ser, y consiguieses que cada campo de la tabla B refiriera a un campo de l mismo registro de la tabla A, la tabla B sería una replica de la A y eso no tiene ninguna utilidad.

¿Me pudes explicar para qué y en que escenario del mundo puede darse que necesites replicar los valores de una factura de un contrato, en el contrato mismo?
No existe un requerimiento como ese en ningún sistema que yo haya visto, y aunque existiera, estarías creando una dependencia circular, que es incumplible.
__________________
¿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: tabla, 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 20:19.