es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Las relaciones muchos a muchos en MySQL tienen que ser las claves foráneas las claves primarias de ambas tablas en las tablas de conexiones?

Digamos que tengo una tabla de pedidos y una tabla de artículos:

CREATE TABLE si no existe ORDERS (
ORDERID INTEGER AUTO_INCREMENT,
ORDERTYPE VARCHAR (20) NOT NULL,
ShippedTime VARCHAR(40),
ORDERDATE DATE,
PRIMARY KEY (ORDERID),
);
CREATE TABLE si no existe ITEM(
ITEMID INTEGER AUTO_INCREMENT,
NAME VARCHAR (20) NOT NULL,
PRICE INTEGER NOT NULL CHECK (PRICE > 0),
PRIMARY KEY (ITEMID)
);

y la relación entre ambas tablas será existof:

CREATE TABLE si no existe EXISTOF (
ORDERID INTEGER NOT NULL,
ITEMID INTEGER NOT NULL,
FOREIGN KEY (ORDERID) REFERENCES ORDERS(ORDERID) ON DELETE CASCADE,
FOREIGN KEY (ITEMID) REFERENCES ITEM(ITEMID) ON DELETE CASCADE,
PRIMARY KEY (ORDERID,ITEMID)
);

La explicación es que cada pedido tiene varios artículos y cada artículo pertenece a muchos pedidos.
Si hago esto, no funcionará porque los IDs son claves primarias y no puedo insertar múltiples artículos para un pedido específico, y tampoco pueden los artículos pertenecer a múltiples pedidos.
¿Alguien tiene alguna recomendación sobre cómo hacerlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de que cada pedido tenga múltiples artículos y cada artículo pertenezca a muchos pedidos, se debe establecer una relación de muchos a muchos entre las tablas ORDERS e ITEM.

    Una solución sería crear una tercera tabla, llamada ORDER_ITEMS, que contenga las claves foráneas de las tablas de pedido y artículo. Esta tabla también incluiría cualquier atributo adicional relacionado con la relación entre pedidos y artículos, como cantidad o descuento.

    La tabla ORDER_ITEMS se podría crear de la siguiente manera:

    CREATE TABLE if not exists ORDER_ITEMS (
        ORDERID INTEGER NOT NULL,
        ITEMID INTEGER NOT NULL,
        QUANTITY INTEGER NOT NULL CHECK (QUANTITY > 0),
        DISCOUNT DECIMAL(5,2) CHECK (DISCOUNT >= 0 AND DISCOUNT <= 1),
        PRIMARY KEY (ORDERID, ITEMID),
        FOREIGN KEY (ORDERID) REFERENCES ORDERS(ORDERID)  ON DELETE CASCADE,
        FOREIGN KEY (ITEMID) REFERENCES ITEM(ITEMID)  ON DELETE CASCADE
    );
    

    Con esta estructura, cada pedido puede tener varios artículos asignados a él, y cada artículo puede pertenecer a varios pedidos. Los atributos de cantidad y descuento también pueden ser rastreados para cada relación entre pedido y artículo.

    En general, la clave es establecer una relación de muchos a muchos entre los pedidos y los artículos, lo cual se puede lograr mediante una tercera tabla que contenga claves foráneas de ambas tablas.

Comments are closed.