mysql - 如何将多个 ID 应用于 Mysql 中的一条记录?

标签 mysql database netbeans mysql-workbench

我使用 MySQL Workbench 为我的电子商务创建了一个数据库,我正在使用 Netbeans 将所有内容放在一起。我几乎没有什么表可以达到我想要达到的目的。其中两个连接在一起的表是产品,当然还有类别

我正准备将数据添加到两个表中。显然,每个类别 都有自己的category_id

问题:一个产品可以属于多个类别(因此有多个 category_id 但我不知道该怎么做,因为 Netbeans 似乎只允许一个category_id 每个产品,无论我是使用命令行还是手动操作。

enter image description here

enter image description here

正如您在图片上看到的,名为 mac 的产品被设置为 technology for home,其 category_id 为 208。但同一产品也可能属于 209(办公技术)。

我该如何实现这一目标?每次我需要一个产品属于多个类别时,我是否需要为同一产品输入一个新行?比方说,如果一个产品可以属于 3 个类别,我需要输入 3 条记录吗?是否有另一种方法可以做到这一点,因为据我所知,这会非常漫长且令人筋疲力尽,不是吗?

谢谢

最佳答案

这在实体关系术语中称为多对多关系。一个产品可以有多个类别,一个类别可以有多个产品。

要在关系数据库中执行此操作,您需要三个 表。

product:  product_id, name, description, etc
category: category_id, catname, catdescription, etc

然后这个所谓的连接表建立产品和类别之间的关系。

product_category:  product_id, category_id

product_category 的主键是两个列在一起——它是一个复合主键。

如果你有这些产品

1 chromebook
2 minitower
3 macbook
4 laptop

和这些类别

1 chromeos
2 portable
3 windows 7
4 macos

然后您将在 product_category 表中拥有这些条目

1  1   chromebook categories: ... chromeos
1  2                          ... portable
2  3   minitower category     ... windows 7
3  2   macbook categories     ... portable
3  4                          ... macos
4  2   laptop categories      ... portable
4  3                          ... windows 7

所以,如果你想查看每个产品的类别,你可以这样做

 SELECT name, description,
        GROUP_CONCAT(catname) categories
   FROM product
   JOIN product_category USING (product_id)
   JOIN category USING (category_id)

同样,如果您想要所有笔记本电脑,也可以这样做。

 SELECT name, description
   FROM product
   JOIN product_category USING (product_id)
   JOIN category USING (category_id)
  WHERE catname = 'laptop'

如果你想要所有的 macos 笔记本电脑设备,那就有点复杂了。

 SELECT name, description
   FROM product p
   JOIN product_category pca ON p.product_id = pca.product_id
   JOIN category ca   ON pca.product_id = ca.product_id
                     AND ca.catname = 'macos'
   JOIN product_category pcb ON p.product_id = pcb.product_id
   JOIN category ca   ON pcb.product_id = cb.product_id
                     AND cb.catname = 'laptop'

请注意,复合主键可防止您将产品多次分配给一个类别,反之亦然。

专业提示:为清楚起见,最好在所有表中使用相同的列名称作为您联接的值。例如,product_id 同时出现在 productproduct_category 表中。

关于mysql - 如何将多个 ID 应用于 Mysql 中的一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243349/

相关文章:

c - Windows : trouble with command line arguments 上的进程和线程 C 编程

php - 将平面多维数组转换为分层数组——用于相册和照片

javascript - 新的数据库元素只能通过刷新整个页面来显示

sql-server - SQL 查询 - "TypeError: sequence item 0: expected string, Decimal found"使用值

php - 在实例化自己对象的函数内部使用 PHP 中的模拟对象

java:从终端而不是从 netbeans 运行时出现 NoClassDefFoundError

java - Netbeans IDE - 键入时自动建议

mysql - sql 选择所有记录

MySQL:按值优先级获取列

mysql - 在 mysql 中添加外键和引用键时出现错误