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

error al crear tablas vida o muerte plis

Estas en el tema de error al crear tablas vida o muerte plis en el foro de Mysql en Foros del Web. estoy creando una base de datos y al pasar el código a mysql en la tabla factura me dice que no puede crearla pero no ...
  #1 (permalink)  
Antiguo 05/09/2011, 10:07
 
Fecha de Ingreso: agosto-2011
Ubicación: barcelona
Mensajes: 237
Antigüedad: 12 años, 8 meses
Puntos: 1
error al crear tablas ayuda porfa

estoy creando una base de datos y al pasar el código a mysql en la tabla factura me dice que no puede crearla pero no me dice cual es el problema no se si podrían ser los index es que soy novata en esto y no veo el error alguien me podría orientar que tengo o estoy haciendo mal muchas gracias a todos los foreros del estos foros,

este es el código:

Código MySQL:
Ver original
  1. CREATE TABLE tienda
  2. (
  3. tienda INT NOT NULL,
  4. tipo_de_tienda  VARCHAR(100),
  5. PRIMARY KEY (tienda_id,tienda),
  6. INDEX (tienda))
  7.  
  8. CREATE TABLE usuarios
  9. (
  10. tienda INT NOT NULL,
  11. nombre VARCHAR(50),
  12.  apellidos VARCHAR(50),
  13. email VARCHAR(100),
  14. pasword VARCHAR(50),
  15. fecha_alta TIMESTAMP,
  16. PRIMARY KEY (usuario_id),
  17. FOREIGN KEY (tienda) REFERENCES tienda (tienda))
  18.  
  19.  
  20. CREATE TABLE productos
  21. (
  22. producto_id INT NOT NULL AUTO_INCREMENT,
  23. tienda  INT NOT NULL,
  24. precio_producto DOUBLE  NOT NULL ,
  25. detalle_producto  CHAR NOT NULL,
  26. foto_producto VARCHAR (100),
  27. existencias_producto DOUBLE,
  28. ref_producto DOUBLE,
  29. nombre_producto VARCHAR (100),
  30. PRIMARY KEY (producto_id),
  31. FOREIGN  KEY (tienda) REFERENCES tienda (tienda))
  32.  
  33. CREATE TABLE usuario_user
  34. (
  35. usuario_user_id INT NOT NULL  AUTO_INCREMENT,
  36. nombre_user  VARCHAR(60) NOT NULL,
  37. apellido_user VARCHAR(70) NOT NULL,
  38. tienda  INT NOT NULL,
  39. email VARCHAR(100),
  40. password_user_invitado VARCHAR(50),
  41. fecha_alta_invitado TIMESTAMP,
  42. PRIMARY KEY (usuario_user_id,nombre_user,apellido_user),
  43. INDEX(usuario_user_id),
  44. FOREIGN KEY (tienda) REFERENCES tienda (tienda)
  45.  
  46.  
  47. CREATE TABLE factura
  48. (
  49. nombre_producto VARCHAR(100),
  50. cantidad_producto DOUBLE,
  51. total_factura DOUBLE NOT NULL,
  52. tienda INT NOT NULL,
  53. nombre_user VARCHAR (50) NOT NULL,
  54. apellido_user VARCHAR(70)NOT NULL,
  55. PRIMARY KEY (factura_id),
  56. INDEX(factura_id),
  57. FOREIGN KEY (tienda) REFERENCES tienda(tienda),
  58. FOREIGN KEY (total_factura) REFERENCES pedidos(total_factura),
  59. FOREIGN KEY (nombre_user) REFERENCES usuario_user (nombre_user),
  60. FOREIGN KEY (apellido_user) REFERENCES usuario_user (apellido_user))
  61.  
  62. CREATE TABLE pedidos
  63. (
  64. pedido_id INT NOT NULL  AUTO_INCREMENT,
  65. tienda  INT NOT NULL,
  66. nombre_user  VARCHAR(50) NOT NULL,
  67. apellido_user VARCHAR(70) NOT NULL,
  68. fecha_pedido TIMESTAMP,
  69. total_factura DOUBLE    NOT  NULL,
  70. PRIMARY KEY (pedido_id,total_factura),
  71. FOREIGN KEY (tienda) REFERENCES tienda (tienda),
  72. FOREIGN KEY (nombre_user) REFERENCES usuario_user (nombre_user),
  73. FOREIGN KEY (apellido_user) REFERENCES usuario_user (apellido_user))
  74.  
  75.  
  76. CREATE TABLE noticias_tienda
  77. (
  78. tienda INT NOT NULL,
  79. titular VARCHAR(100),
  80. texto TEXT,
  81. grupo INT,
  82. fecha_notocia TIMESTAMP,
  83. PRIMARY KEY (noticia_id),
  84. FOREIGN KEY (tienda) REFERENCES tienda (tienda))

Última edición por carolina3; 05/09/2011 a las 17:10
  #2 (permalink)  
Antiguo 06/09/2011, 01:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: error al crear tablas vida o muerte plis

...
FOREIGN KEY (total_factura) REFERENCES pedidos(total_factura),
...

....

CREATE TABLE pedidos
....


El script se ejecuta secuencialmete, luego dificil que puedas hacer referencia a un objeto que aún no existe... combia el orden de ejecución....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 06/09/2011, 08:34
 
Fecha de Ingreso: agosto-2011
Ubicación: barcelona
Mensajes: 237
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: error al crear tablas vida o muerte plis

muy buenas quimfv te refieres a que coloque la tabla pedidos antes que la de factura.
  #4 (permalink)  
Antiguo 06/09/2011, 09:13
 
Fecha de Ingreso: agosto-2011
Ubicación: barcelona
Mensajes: 237
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: error al crear tablas vida o muerte plis

pues el orden podría ser que estuviese mal pero el problema sigue ahora con la tabla pedidos no veo el error por ninguna parte mysql dice error 150 pero no encuentro a que se refiere.

alguien podría aportar alguna idea por favor
  #5 (permalink)  
Antiguo 06/09/2011, 10:17
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 vida o muerte plis

Básicamente tienes una mala construcción de las claves primarias en casi todas las tablas, y una errónea definición de las claves foráneas, que no respetan el esquema de las PK.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 06/09/2011, 10:23
 
Fecha de Ingreso: agosto-2011
Ubicación: barcelona
Mensajes: 237
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: error al crear tablas vida o muerte plis

gnzsoloyo podrías echarme una mano es la primera base de datos que creo y ya suponía que la construcción me traería problemas pero puedes orientarme un poco que tengo mal, te lo agradecería llevo mucho tiempo montando esto
  #7 (permalink)  
Antiguo 06/09/2011, 11:06
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 vida o muerte plis

Hay dos cosas que debes tener en cuenta a la hora de definir claves:
1) Una clave primaria es un atributo o conjunto de atributos que identifican unívocamente un registro en una tabla (definición general).
Esto significa que:
- Si tienes un campo que por si mismo es capaz de identificar un registro dado, no necesitas poner más que uno como PK.
- Si y sólo si no es suficiente con un campo, puede usarse para hacer una PK varios al mismo tiempo.
- Es preferible siempre usar un campo cuyo valor sea propio de la entidad representada.

En tu caso, en la tabla "tienda" ya tienes un campo numérico autoincremental, el cual jamás se repetirá. ¿Para qué creas esa PK con dos campos, entonces?
Eso mismo lo estás haciendo con "Pedidos" y "Usuario". Nada de eso tiene sentido.

En el caso de "Usuario", el hecho de que un usuario tenga un username posible irrepetible hace que no se necesite ningún otro dato. No tiene ninguna utilidad en ese caso hacer un autoincremental para ello. Resulta redundante.

2) Una FOREIGN KEY es un campo o conjunto de campos que hacen referencia a la clave primaria de otra tabla.
Las FK surgen de las relaciones entre entidades (tablas en el modelo físico de BBDD), y se ajustan a la cardinalidad de las relaciones.
- En una relación 1:1, la PK va como FK en aquella donde exista correspondencia lógica. El ejemplo sería que la matrícula pertenece a un único vehículo. En ese caso la PK de Matrícula va en vehículo y lno a la inversa.
- En las relaciones 1:N, las PK van como FK en la tabla donde la cardinalidad sea N.
- Las relaciones N:N no transfieren su Pk como FK a la otra tabla, sino que se debe generar una tercera tabla (relacional) que administre la relación. En esa tabla ambas PK van como FK y al mismo tiempo ambas son PK de esa tabla.

Lo que debe quedarte claro es que una FK, como se refiere a una PK de una tabla debe tener la misma cantidad de campos que la PK original, del mismo tipo y ser del mismo rango. Eso es una de las cosas que no estás respetando.

Algunas observaciones que se pueden hacer son, por ejemplo:
- Tienes dos identificadores posibles para "Tienda": tienda_id y tienda. ¿Por qué? Sólo necesitas uno, y si las tiendas en cuestión tienen su propia designación en la empresa, es esa designación la que debes usar. La otra es superflua.
- Usuario puede utilizar un username como identificador, o bien el e-mail. Es más eficiente como dato. Si vas a usar una numeración específica, bien, pero que tenga sentido dentro del ssitema y debe ser la misma que se usa en cualquier otro tipo de documentación no informática que exista.
- La tabla Producto no debe contener el numero de tienda. En todo caso lo que te falta es una tabla para controlar el stock de la tienda, ya que una tienda puede tener muchos productos y cada producto estar en diferentes tiendas (relación N.N). Eso requiere de una tabla específica.
- La tabla usuario_user parece redundante respecto a la tabla usuarios. ¿Qué representa?
- Tablas del tipo Factura se deben desdoblar en Factura y Detalle. Revisa el tema de Formas Normales para una mejor comprensión.

Consejo final (por ahora): Estudia un poco más del modelo entidad-relación y de diseño de bases de datos antes de meterte a planear sistemas algo elaborados como el que quieres hacer, o terminarás inventando la rueda varias veces antes de completarlo.

Suerte...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 07/09/2011, 05:26
 
Fecha de Ingreso: agosto-2011
Ubicación: barcelona
Mensajes: 237
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: error al crear tablas vida o muerte plis

gnzsoloyo para empezar muchas gracias por tus aclaraciones te debo unas cuantas ya en estos foros,

la tabla tienda tienes razón he eliminado el identificador con el campo tienda para PK es suficiente ya que el nombre de las tiendas no debe repetirse nunca.

en el caso de usuarios me dices por que tengo dos tablas con usuario y usuario_user bueno es sencillo te explicare un poco la idea pues aclarare algunas dudas, un usuario se registra en la web el cual crea su tienda y dentro de esta tienda debe tener sus propios usuarios por eso las dos tablas, los usuarios de mi web gestionaran a sus propios usuarios.

La tabla producto básicamente sirve para que los propietarios de las tiendas puedan rellenar las características del producto, con su foto precio etc... ahy tengo una duda de como crear una referencia para los productos teniendo en cuenta de que cada tienda debe tener referencias diferentes por no ser de la misma.

la tabla factura he optado por eliminarla en definitiva esta y la de pedido era para posteriores ampliaciones del proyecto de momento optare por quedarme con la de pedido para poder saber cuantos pedidos realizan los usuarios de cada tienda.


bueno ya se parece un poco lioso pero por hay va la idea, asi me quedaron las tablas después de tu aporte ahora mysql me las coje todas, pero seguro que se puede mejorar y mucho supongo que me iré encontrando con problemas uno de ellos los indices que por mucho que leo sobre ellos sigo sin entender muy bien su función.


Código MySQL:
Ver original
  1. CREATE TABLE tienda
  2. (
  3. tienda INT NOT NULL,
  4. tipo_de_tienda VARCHAR(100),
  5. PRIMARY KEY (tienda),
  6. INDEX (tienda))
  7.  
  8.  
  9. CREATE TABLE usuarios
  10. (
  11. tienda INT NOT NULL,
  12. nombre VARCHAR(50),
  13.  apellidos VARCHAR(50),
  14. email VARCHAR(100),
  15. pasword VARCHAR(50),
  16. fecha_alta TIMESTAMP,
  17. PRIMARY KEY (usuario_id),
  18. FOREIGN KEY (tienda) REFERENCES tienda (tienda))
  19.  
  20.  
  21. CREATE TABLE productos
  22. (
  23. producto_id INT NOT NULL AUTO_INCREMENT,
  24. tienda  INT NOT NULL,
  25. precio_producto DOUBLE  NOT NULL ,
  26. detalle_producto CHAR NOT NULL,
  27. foto_producto VARCHAR (100),
  28. existencias_producto DOUBLE,
  29. ref_producto DOUBLE,
  30. nombre_producto VARCHAR (100),
  31. PRIMARY KEY (producto_id),
  32. FOREIGN  KEY (tienda) REFERENCES tienda (tienda))
  33.  
  34. CREATE TABLE usuario_user
  35. (
  36. usuario_user_id INT NOT NULL  AUTO_INCREMENT,
  37. email_user VARCHAR(100)NOT NULL,
  38. nombre_user VARCHAR(60) NOT NULL,
  39. apellido_user VARCHAR(70) NOT NULL,
  40. tienda INT NOT NULL,
  41. password_user_invitado VARCHAR(50),
  42. fecha_alta_invitado TIMESTAMP,
  43. PRIMARY KEY (usuario_user_id,email_user),
  44. INDEX(email_user),
  45. FOREIGN KEY (tienda) REFERENCES tienda (tienda)
  46.  
  47.  
  48. CREATE TABLE noticias_tienda
  49. (
  50. tienda INT NOT NULL,
  51. titular VARCHAR(100),
  52. texto TEXT,
  53. grupo INT,
  54. fecha_notocia TIMESTAMP,
  55. PRIMARY KEY (noticia_id),
  56. FOREIGN KEY (tienda) REFERENCES tienda (tienda)
  57. )
  58.  
  59.  
  60.  
  61. CREATE TABLE pedidos
  62. (
  63. pedido_id INT NOT NULL  AUTO_INCREMENT,
  64. email_user VARCHAR(100)NOT NULL,
  65.  total_factura DOUBLE   NOT  NULL,
  66. tienda  INT NOT NULL,
  67. fecha_pedido TIMESTAMP,
  68. PRIMARY KEY (pedido_id),
  69. FOREIGN KEY (tienda) REFERENCES tienda (tienda),
  70. FOREIGN KEY (email_user) REFERENCES usuario_user(email_user)
  71. )

Etiquetas: plis, sql, 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 17:09.