Mysql更新多行

问题描述 投票:0回答:1

我有2张桌子。类别表中的“ media_id”引用媒体表中的“ id”。媒体表中的每个项目在类别表中可以具有零个或多个类别。

媒体表


| id | options
|----------------|
| 1  | ...  
|----------------|
| 2  | ...    
|----------------|
| 3  | ...    
|________________|

类别表

 __________________________
| id | category | media_id |
|--------------------------|
| 1  | fashion  | 1        |
|--------------------------|
| 2  | sport    | 2        |
|--------------------------|
| 3  | sport    | 3        | 
|--------------------------|
| 4  | cats     | 4        |
|--------------------------|
| 5  | dogs     | 4        |
|--------------------------|
| 6  | sport    | 5        | 
|__________________________|

当我将数据保存在表中时,我想更新类别。我以前的流行方式是:

对于每种媒体:

  1. 删除以前的类别:

    从类别表中删除,其中media_id =%d

  2. 添加新类别

对于每个类别:(可以有零个或多个)

插入类别表(类别,媒体ID)

这很好,但是它会运行很多查询(对于每种媒体,请删除先前的类别,如果该媒体上存在类别,则为每个新类别插入新的类别)。

我已经在类别表中有了一个约束,该约束使用该media_id引用了媒体表,并且每次删除媒体时,都会为该媒体删除所有类别。这很好用。

问题是何时有人编辑所有这些媒体(在所有这些媒体上添加和删除某些类别,而我要保存这些更改。

如何改善类别表的更新过程?

mysql database database-design many-to-many
1个回答
1
投票

您需要三个表并进行一些重新编程

第一张表:media(mid,etc,etc2)

| mid| options
|----------------|
| 1  | ...  
|----------------|
| 2  | ...    
|----------------|
| 3  | ...    
|________________|

第二表:category (cid,category)

| cid | category |
|---------------|
| 1  | fashion  |
|---------------|
| 2  | sport    |
|---------------|
| 3  | cats     |
|---------------|
| 4  | dogs     |
|---------------|
| 5  | frogs    |
|_______________|

第三,关系表:rel_cat_media(id , ref_cid , ref_mid)

| id | ref_cid  |  ref_mid |
|--------------------------|
| 1  |    1     | 1        |
|--------------------------|
| 2  |    3     | 2        |
|--------------------------|
| 3  |    2     | 3        | 
|--------------------------|
| 4  |    3     | 4        |
|--------------------------|
| 5  |    4     | 4        |
|--------------------------|
| 6  |    2     | 5        | 
|__________________________|

[拥有新类别时,您永远不会删除类别,只会添加到类别中。

当您删除介质时,您还具有一个AFTER DELETRE TRIGGER,它也从删除介质中删除具有media_id的所有行,因此您可以一次删除多个介质并删除所有相关行。

可以在关系表中插入新行,可以插入行,也可以不插入行。但这可以通过在gui中选择类别,然后使用新插入的mid(media id)运行循环来实现。

只需要一点编程,就不会有太多麻烦。

SELECT查询需要另一个INNER JOIN

© www.soinside.com 2019 - 2024. All rights reserved.