【问题标题】:Delete a row with relations with other tables删除与其他表有关系的行
【发布时间】:2013-04-26 11:37:49
【问题描述】:

如果我有以下表格:

Product
+----+------+
| id | name |
+----+------+
|  1 | box  |
|  2 | car  |
|  3 | ball |
+----+------+

Color
+----+-------+
| id | name  |
+----+-------+
|  1 | red   |
|  2 | green |
|  3 | blue  |
+----+-------+

Size
+----+--------+
| id | number |
+----+--------+
|  1 |      1 |
|  2 |      5 |
|  3 |     10 |
+----+--------+

Color Options (#product | #color)
+---------+-------+
| product | color |
+---------+-------+
|       1 |     1 |
|       1 |     3 |
|       3 |     1 |
|       3 |     2 |
|       2 |     3 |
+---------+-------+

Size Options (#product | #size)
+---------+-------+
| product | color |
+---------+-------+
|       1 |     1 |
|       1 |     2 |
|       3 |     1 |
|       3 |     2 |
|       2 |     2 |
|       2 |     3 |
+---------+-------+

当我删除一个产品时,删除它与颜色和尺寸的关系的最佳方法是什么?我需要在每个表中进行删除还是有任何自动过程?

【问题讨论】:

  • 我会创建一个 deleteProduct($id) 类型的函数,用于在所有表上运行 DELETE 查询

标签: mysql


【解决方案1】:

INNER JOIN 是一个答案

DELETE
FROM Product p
  INNER JOIN Color_Options co
    ON co.product = p.id
  INNER JOIN Color c
    ON co.color = c.id
  INNER JOIN Size_Options so
    ON co.product = p.id
  INNER JOIN Size s
    ON so.color = s.id

【讨论】:

    【解决方案2】:

    你是否为你的mysql设置了正确的RELATIONSHIP? 你可以参考这个问题 How to create relationships in MySQLMySQL foreign key constraints, cascade delete

    【讨论】:

    • 您必须在引用外键时添加 ON DELETE CASCADE 以便在您的情况下它会自动删除
    【解决方案3】:
    CREATE TABLE SIZE_OPTIONS(PRODUCT REFERENCES PRODUCT(ID), COLOR REFERENCES COLOR_OPTIONS(COLOR) ON DELETE CASCADE);
    

    使用与 COLOR_OPTIONS 相同的语句类型。

    【讨论】:

    • 每次我使用外键时,我应该使用 ON DELETE CASCADE 吗?你不是说:CREATE TABLE SIZE_OPTIONS(PRODUCT REFERENCES PRODUCT(ID) ON DELETE CASCADE);
    • 如果你想让关系有级联效果,使用ON DELETE CASCADE。不,如果你不想这样做
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多