【发布时间】:2022-01-21 10:28:05
【问题描述】:
假设我有一个订单表和项目表:
CREATE TABLE if not exists ORDERS (
ORDERID INTEGER AUTO_INCREMENT,
ORDERTYPE VARCHAR (20) NOT NULL,
ShippedTime VARCHAR(40),
ORDERDATE DATE,
PRIMARY KEY (ORDERID),
);
CREATE TABLE if not exists ITEM(
ITEMID INTEGER AUTO_INCREMENT,
NAME VARCHAR (20) NOT NULL,
PRICE INTEGER NOT NULL CHECK (PRICE > 0),
PRIMARY KEY (ITEMID)
);
两个表之间的关系将是存在的:
CREATE TABLE if not exists 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)
);
解释应该是每个订单有多个项目,每个项目属于多个订单。 如果我这样做,它将不起作用,因为 id 是主键,我不能为特定订单插入多个项目,也不能项目属于多个订单。 有没有人有任何建议如何做到这一点?
【问题讨论】:
-
PRIMARY KEY (ORDERID,ITEMID) 很好,如果一个订单只能包含许多项目中的一个 itemid,如果一个订单可以在一个订单中多次包含相同的 itemid,那么一个键(即不是主键或唯一键)将是合适的 - 在任何一种情况下,都必须在连接表之前创建订单(和项目)
-
那么可以不让orderid和itemid不是existof表中的主键吗?正如我所知,在多对多关系中应该创建新表,其主键是两个 id 还是错误?
-
这取决于你。您可以定义具有唯一联结表 ID 和具有订单 ID 和订单项 ID 的唯一索引的联结表,或者您可以创建具有订单 ID 和订单项 ID 的复合主键。无论哪种方式都有优点和缺点。我的偏好是每个表都有一个唯一的自动递增 ID,并且所有参考 ID 都被编入索引。
标签: mysql sql database-design