mysql - 在一个订单中添加具有相同客户 ID 的多个产品
问题描述
有关于这个的堆栈溢出帖子,但我没有找到一个很好的解释,所以这就是我想要做的:
我有一个orders,products和一个clients表,我需要能够在 orders 表中添加多个产品。我发现我可以创建另一个像 order_products 这样的表来解决这个问题,但我只是不明白如何保存多个产品,为什么这应该解决我的问题?
我需要一个完整的解释,谢谢。
解决方案
如果您将在每一行中引用它们所属的订单,则可以将多个产品保存在 order_products 表中。考虑这个sql(理解这个概念非常基础):
--I use 'ordination' instead of 'order' because 'order' is
--reserverd word in SQL
CREATE TABLE client(
id INT(3),
name VARCHAR(20),
PRIMARY KEY(id)
);
CREATE TABLE product(
id INT(3),
name VARCHAR(20),
price NUMERIC(4,2),
PRIMARY KEY(id)
);
CREATE TABLE ordination(
id INT(3),
client_id INT(3),
ordination_date TIMESTAMP,
PRIMARY KEY(id),
FOREIGN KEY(client_id) REFERENCES client(id)
);
CREATE TABLE ordination_product(
product_id INT(3),
ordination_id INT(3),
quantity INT(3),
PRIMARY KEY(product_id,ordination_id),
FOREIGN KEY(product_id) REFERENCES product(id),
FOREIGN KEY(ordination_id) REFERENCES ordination(id)
);
创建戒律时,请遵循以下步骤:
- 使用客户端 ID 在引用客户端的顺序中创建一行。
- 在 ordination_product 中为客户订购的每个产品创建一行,并使用 ordination id 引用 ordination。
如果您需要检索特定排序中的产品,您可以使用 ordination_id 在 ordination_product 表中进行选择。
推荐阅读
- mysql - mysql导入自引用表跳过记录
- android - 如何使 Slider 在 Android 上运行?
- java - 即使已经设置了对应的 ObjectOutputStream,ObjectInputStream 构造函数也会挂起
- java - 如何在 android 模块中将胡椒文本更改为语音速度?
- c# - MVC 5.2 如何为本地日期时间设置默认值?
- ruby-on-rails - 如何将零填充到十进制结果
- ethercat - SDO ethercat SOEM/SOES
- java - 我想创建一个 bean 并在服务启动时让它活着(2 个组件的上下文)
- mysql - 如何计算多个类别中的品牌
- android - TimePicker 对话框未显示 AM PM 选择的颜色