Autor
|
Tema: Pasar a MySQL (Leído 7,544 veces)
|
thebus4k
Desconectado
Mensajes: 39
|
Hola a todos! Me ha surgido un problema a la hora de crear una base de datos El problema es que según entiendo se necesita una tabla adicional y tres claves foráneas y no sé muy bien como crear la sentencia que cree todo ello. Un saludo.
|
|
« Última modificación: 3 Junio 2020, 19:43 pm por thebus4k »
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Así es, una relación de cardinalidad N:M constituye una nueva entidad (tabla) que estará formada por las claves primarias de ambas tablas originales (que formarán conjuntamente la clave primaria de la nueva tabla) y los atributos de relación que pudiese haber (pudiendo ser alguno de ellos un discrimante y entonces habría que incluirlo en la clave primaria de la nueva tabla). CREATE TABLE [IF NOT EXISTS] Pedido ( id_pedido INT PRIMARY KEY [AUTO_INCREMENT], ... ); CREATE TABLE [IF NOT EXISTS] Producto ( id_producto INT PRIMARY KEY [AUTO_INCREMENT], ... ); -- Tabla resultante de la relacion: CREATE TABLE [IF NOT EXISTS] Inventario ( id_pedido INT, id_producto INT, cantidad INT [DEFAULT 1], -- Cantidad del producto id_producto que hay en el pedido id_pedido, [por defecto: 1] PRIMARY KEY(id_pedido, id_producto), [CONSTRAINT FK_Inventario_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido), [CONSTRAINT FK_Inventario_Producto] FOREIGN KEY (id_producto) REFERENCES Producto(id_producto) );
Por ejemplo a esta relación le vendría bastante bien el atributo de relación <cantidad> para saber cuántos productos de cada tipo hay en cada pedido. Las partes entre corchetes [] son opcionales y si se ponen tienes que quitar los corchetes.
El DELETE ON CASCADE tienes que incluirlo en la FOREIGN KEY de la tabla que quieres que se elimine en cascada, es decir, de la tabla opuesta a la que tú vas a borrar. En este caso si quieres que al eliminar un Pedido, se elimine un Pago, Pedido tiene que ser la tabla independiente (que no contiene la FK) y Pago será la dependiente. CREATE TABLE [IF NOT EXISTS] Pago ( id_pago INT PRIMARY KEY [AUTO_INCREMENT], ... id_pedido INT, [CONSTRAINT FK_Pago_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido) ON DELETE CASCADE );
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
thebus4k
Desconectado
Mensajes: 39
|
Así es, una relación de cardinalidad N:M constituye una nueva entidad (tabla) que estará formada por las claves primarias de ambas tablas originales (que formarán conjuntamente la clave primaria de la nueva tabla) y los atributos de relación que pudiese haber (pudiendo ser alguno de ellos un discrimante y entonces habría que incluirlo en la clave primaria de la nueva tabla). CREATE TABLE [IF NOT EXISTS] Pedido ( id_pedido INT PRIMARY KEY [AUTO_INCREMENT], ... ); CREATE TABLE [IF NOT EXISTS] Producto ( id_producto INT PRIMARY KEY [AUTO_INCREMENT], ... ); -- Tabla resultante de la relacion: CREATE TABLE [IF NOT EXISTS] Inventario ( id_pedido INT, id_producto INT, cantidad INT [DEFAULT 1], -- Cantidad del producto id_producto que hay en el pedido id_pedido, [por defecto: 1] PRIMARY KEY(id_pedido, id_producto), [CONSTRAINT FK_Inventario_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido), [CONSTRAINT FK_Inventario_Producto] FOREIGN KEY (id_producto) REFERENCES Producto(id_producto) );
Por ejemplo a esta relación le vendría bastante bien el atributo de relación <cantidad> para saber cuántos productos de cada tipo hay en cada pedido. Las partes entre corchetes [] son opcionales y si se ponen tienes que quitar los corchetes.
El DELETE ON CASCADE tienes que incluirlo en la FOREIGN KEY de la tabla que quieres que se elimine en cascada, es decir, de la tabla opuesta a la que tú vas a borrar. En este caso si quieres que al eliminar un Pedido, se elimine un Pago, Pedido tiene que ser la tabla independiente (que no contiene la FK) y Pago será la dependiente. CREATE TABLE [IF NOT EXISTS] Pago ( id_pago INT PRIMARY KEY [AUTO_INCREMENT], ... id_pedido INT, [CONSTRAINT FK_Pago_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido) ON DELETE CASCADE );
Entre las demás tablas y relaciones, habría que crearlas normal o como has hecho tú?
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Entre las demás tablas y relaciones, habría que crearlas normal o como has hecho tú?
No sé a qué te refieres con crearlas normal o como las he hecho yo... Si te refieres a lo de crear una nueva tabla para la relación, eso es necesario únicamente para las relaciones con cardinalidad N:M. Digamos que la regla general es: - Cardinalidad N:M -> Nueva tabla formada por las PKs de las dos tablas [+ discriminantes] como PK de la nueva, otros atributos de la relación y FKs de cada PK original a su tabla de origen.
- Cardinalidad 1:N -> La tabla con cardinalidad N contiene una FK a la PK de la tabla con cardinalidad 1.
- Cardinalidad 1:1 -> Una tabla contiene la FK a la PK de la otra. Cuál? Depende del problema muchas veces. La que más información aporte.
Si te refieres al ON DELETE CASCADE, pues dependerá de lo que quieras eliminar en cascada o no.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
thebus4k
Desconectado
Mensajes: 39
|
No sé a qué te refieres con crearlas normal o como las he hecho yo... Si te refieres a lo de crear una nueva tabla para la relación, eso es necesario únicamente para las relaciones con cardinalidad N:M. Digamos que la regla general es: - Cardinalidad N:M -> Nueva tabla formada por las PKs de las dos tablas [+ discriminantes] como PK de la nueva, otros atributos de la relación y FKs de cada PK original a su tabla de origen.
- Cardinalidad 1:N -> La tabla con cardinalidad N contiene una FK a la PK de la tabla con cardinalidad 1.
- Cardinalidad 1:1 -> Una tabla contiene la FK a la PK de la otra. Cuál? Depende del problema muchas veces. La que más información aporte.
Si te refieres al ON DELETE CASCADE, pues dependerá de lo que quieras eliminar en cascada o no. Sí era eso, el crear una tabla adicional o crear las tablas sin más(con la FK, claro).
|
|
|
En línea
|
|
|
|
thebus4k
Desconectado
Mensajes: 39
|
Así es, una relación de cardinalidad N:M constituye una nueva entidad (tabla) que estará formada por las claves primarias de ambas tablas originales (que formarán conjuntamente la clave primaria de la nueva tabla) y los atributos de relación que pudiese haber (pudiendo ser alguno de ellos un discrimante y entonces habría que incluirlo en la clave primaria de la nueva tabla). CREATE TABLE [IF NOT EXISTS] Pedido ( id_pedido INT PRIMARY KEY [AUTO_INCREMENT], ... ); CREATE TABLE [IF NOT EXISTS] Producto ( id_producto INT PRIMARY KEY [AUTO_INCREMENT], ... ); -- Tabla resultante de la relacion: CREATE TABLE [IF NOT EXISTS] Inventario ( id_pedido INT, id_producto INT, cantidad INT [DEFAULT 1], -- Cantidad del producto id_producto que hay en el pedido id_pedido, [por defecto: 1] PRIMARY KEY(id_pedido, id_producto), [CONSTRAINT FK_Inventario_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido), [CONSTRAINT FK_Inventario_Producto] FOREIGN KEY (id_producto) REFERENCES Producto(id_producto) );
Por ejemplo a esta relación le vendría bastante bien el atributo de relación <cantidad> para saber cuántos productos de cada tipo hay en cada pedido. Las partes entre corchetes [] son opcionales y si se ponen tienes que quitar los corchetes.
El DELETE ON CASCADE tienes que incluirlo en la FOREIGN KEY de la tabla que quieres que se elimine en cascada, es decir, de la tabla opuesta a la que tú vas a borrar. En este caso si quieres que al eliminar un Pedido, se elimine un Pago, Pedido tiene que ser la tabla independiente (que no contiene la FK) y Pago será la dependiente. CREATE TABLE [IF NOT EXISTS] Pago ( id_pago INT PRIMARY KEY [AUTO_INCREMENT], ... id_pedido INT, [CONSTRAINT FK_Pago_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido) ON DELETE CASCADE );
Las claves foráneas quedarían así Id_vendedor en pedido, id_pedido en cliente, id_pago en pedido? No tengo muy claro como crear la estructura con estas claves
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Las claves foráneas quedarían así Id_vendedor en pedido, id_pedido en cliente, id_pago en pedido? No tengo muy claro como crear la estructura con estas claves
Mira a ver si tal y como tú dices se cumplen las normas que te puse antes sobre cómo establecer las relaciones. Ya te adelanto que la segunda no lo cumple. Y la tercera ya te lo puse yo con la clave de id_pedido en Pago, no sé si de verdad necesitas guardarlo al revés también.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
thebus4k
Desconectado
Mensajes: 39
|
Mira a ver si tal y como tú dices se cumplen las normas que te puse antes sobre cómo establecer las relaciones. Ya te adelanto que la segunda no lo cumple. Y la tercera ya te lo puse yo con la clave de id_pedido en Pago, no sé si de verdad necesitas guardarlo al revés también.
No sería necesario guardarlo al revés creo yo, solo necesito lo que puse en la primera entrada(no estoy seguro xdd)
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
No sería necesario guardarlo al revés creo yo, solo necesito lo que puse en la primera entrada(no estoy seguro xdd)
Pues entonces con tener la relación hecha en el otro sentido ya vale. Además la importante es la que te permite borrar el pago automáticamente cuando borras el pedido relacionado. Así que ya sabes: esa no hace falta y la otra la estabas poniendo al revés. Ahora te toca hacerlo en MySQL.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
thebus4k
Desconectado
Mensajes: 39
|
Así es, una relación de cardinalidad N:M constituye una nueva entidad (tabla) que estará formada por las claves primarias de ambas tablas originales (que formarán conjuntamente la clave primaria de la nueva tabla) y los atributos de relación que pudiese haber (pudiendo ser alguno de ellos un discrimante y entonces habría que incluirlo en la clave primaria de la nueva tabla). CREATE TABLE [IF NOT EXISTS] Pedido ( id_pedido INT PRIMARY KEY [AUTO_INCREMENT], ... ); CREATE TABLE [IF NOT EXISTS] Producto ( id_producto INT PRIMARY KEY [AUTO_INCREMENT], ... ); -- Tabla resultante de la relacion: CREATE TABLE [IF NOT EXISTS] Inventario ( id_pedido INT, id_producto INT, cantidad INT [DEFAULT 1], -- Cantidad del producto id_producto que hay en el pedido id_pedido, [por defecto: 1] PRIMARY KEY(id_pedido, id_producto), [CONSTRAINT FK_Inventario_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido), [CONSTRAINT FK_Inventario_Producto] FOREIGN KEY (id_producto) REFERENCES Producto(id_producto) );
Por ejemplo a esta relación le vendría bastante bien el atributo de relación <cantidad> para saber cuántos productos de cada tipo hay en cada pedido. Las partes entre corchetes [] son opcionales y si se ponen tienes que quitar los corchetes.
El DELETE ON CASCADE tienes que incluirlo en la FOREIGN KEY de la tabla que quieres que se elimine en cascada, es decir, de la tabla opuesta a la que tú vas a borrar. En este caso si quieres que al eliminar un Pedido, se elimine un Pago, Pedido tiene que ser la tabla independiente (que no contiene la FK) y Pago será la dependiente. CREATE TABLE [IF NOT EXISTS] Pago ( id_pago INT PRIMARY KEY [AUTO_INCREMENT], ... id_pedido INT, [CONSTRAINT FK_Pago_Pedido] FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido) ON DELETE CASCADE );
Hola de nuevo releyendo me he encontrado con esto: El campo BANCO es un string que representa el nombre del BANCO. (los datos concretos de pago como numero de cuenta se encuentran alojados en otra tabla a la cual se accede a través del número de control) Lo que me raya la cabeza es el contenido del paréntesis, que significa, por más que intento comprender no entiendo lo que se pide.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
MySQL Handler (Clase en php) para los que utilizan MySQL ;)
PHP
|
Luisango
|
4
|
5,867
|
17 Noviembre 2007, 15:42 pm
por Luisango
|
|
|
MySQL.com (also MySQL France,Italy,Japan,Germany,etc) Hacked by TinKode & Ne0h
Bugs y Exploits
|
TinKode
|
1
|
3,652
|
27 Marzo 2011, 17:32 pm
por Tyrz
|
|
|
Problema al pasar a Mysql un Select
Bases de Datos
|
David Vans
|
3
|
4,128
|
1 Septiembre 2011, 04:55 am
por seba123neo
|
|
|
error 1130 mysql host localhost is no allowed to connect to mysql
Bases de Datos
|
josco
|
1
|
5,418
|
9 Enero 2012, 05:32 am
por Shell Root
|
|
|
[C#] Pasar dos argumentos por DisplayMember (Mysql)
.NET (C#, VB.NET, ASP)
|
DeMoNcRaZy
|
2
|
2,519
|
10 Septiembre 2015, 21:38 pm
por DeMoNcRaZy
|
|