mysql - 如何更新实际上在其父级中具有唯一 id 重复项的外键字段?

标签 mysql sql foreign-keys ddl dml

我有一个 Widget 表,其字段为 [id(主键), label}。该表以某种方式作为重复的 label 字段,如下所示。

+-----+----------+
| id  | label    |
+-----+----------+
| 01  | Customer |
| 02  | Client   |
| 03  | Customer |
| 04  | Customer |
| 05  | Customer |
| 06  | Client   |
| 07  | Client   |
+-----+----------+

还有另一个名为 company 的表,其中 label_id 作为外键。外键可以为空。

+-----+------+----------+
| id  | name | label_id |
+-----+------+----------+
| 400 | ABC  | 01       |
| 401 | DEF  | 02       |
| 402 | ADF  | 06       |
| 403 | QWE  | 05       |
| 404 | RST  | 06       |
| 405 | WAS  | null     |
+-----+------+----------+

由于 label_id 0605 是重复的,因为它们指向相同的 CustomerClient 标签。我需要将它们重新分配给 id 01 和 02 以及具有此类重复 label_ids 的所有其他记录。之后删除 Widget 表中的所有重复记录。

Note :`CASCADE on DELETE` referential action is not applied in my table.

需要有关如何执行此操作的建议吗?

最佳答案

不确定您的要求,但也许是这样的

<强> SQL DEMO

UPDATE Company C
SET 
`label_id` =  (SELECT MIN(`id`)
               FROM  Widget
               WHERE `label` = (SELECT `label` 
                                FROM Widget W 
                                WHERE W.`id` = C.`label_id`)
              );

输出

|  id | name | label_id |
|-----|------|----------|
| 400 |  ABC |        1 |
| 401 |  DEF |        2 |
| 402 |  ADF |        2 |
| 403 |  QWE |        1 |
| 404 |  RST |        2 |
| 405 |  WAS |   (null) |

关于mysql - 如何更新实际上在其父级中具有唯一 id 重复项的外键字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406006/

相关文章:

sql - Postgres - 在转义双引号内转义双引号

mysql - SQL 按计数排序

mysql - 如何使用 mysql 删除 youtube id 之后的任何内容?

mysql - mysql 错误(错误 1136)

MySQL:错误 1215:无法添加外键约束

django - 在管理员中按外键 ID 搜索

php - 我可以使用外键限制来使用 PHP 返回有意义的 UI 错误吗

mysql - MyIsam 针对多个 %term% 进行全文搜索

php - 使用 rowspan 将数据从数据库调用到表中

MYSQL:获取上一行但基于非主列