从多个表中删除 MySQL 条记录未按预期工作

Deleting MySQL records from multiple tables doesn't work as expected

大家好,我正在尝试从三个 table 中删除多条记录。 但是它没有按预期工作。

我的查询:

DELETE FROM offer, offer_products, offer_product_addons 
USING offer, offer_products, offer_product_addons  
WHERE offer.offer_number IS NULL
AND offer_products.offer_id = offer.id 
AND offer_product_addons.offer_products_id = offer_products.id;

我的猜测是,当在其他 table 之一中找不到记录时,它不会删除记录。我怎样才能做到这一点,我已经尝试过加入,但只删除了主 table.

中的内容

最好在多个操作上使用 CASCADE 函数,即删除或更新。

CASCADE - 如果 ON UPDATE CASCADEON UPDATE SET NULL 递归更新相同的 table 它之前在级联期间更新过,它的行为类似于 RESTRICT .这意味着您不能使用自引用 ON UPDATE CASCADE 或 ON UPDATE SET NULL 操作。这是为了防止级联更新导致的无限循环。另一方面,自我参照 ON DELETE SET NULL 是可能的,就像自我参照 ON DELETE CASCADE 一样。级联操作的嵌套深度不得超过 15 层。

有时,当您从父 table 中删除数据时,了解哪个 table 受到 MySQL ON DELETE CASCADE 引用操作的影响是很有用的。您可以从 information_schema 数据库中的 referential_constraints 查询此数据,如下所示:

代码:

USE information_schema;
SELECT table_name
FROM referential_constraints
WHERE constraint_schema = 'database_name' AND
      referenced_table_name = 'parent_table' AND
      delete_rule = 'CASCADE'

示例:

例如,要查找与 建筑物相关联的 tables table 与 中的 CASCADE delete rule classicmodels 数据库,你使用下面的查询:

USE information_schema;

SELECT table_name
FROM referential_constraints
WHERE constraint_schema = 'classicmodels' AND
      referenced_table_name = 'buildings' AND
      delete_rule = 'CASCADE'

DELETE CASCADE 的另一个替代示例:

如果您 cascading deletes 核对一个产品,因为它是被杀死的类别的成员,那么您的外键设置不正确。根据您的示例 tables,您应该具有以下 table 设置:

CREATE TABLE category (
    id int unsigned not null primary key,
    name VARCHAR(255) default null
)Engine=InnoDB;

CREATE TABLE product (
    id int unsigned not null primary key,
    name VARCHAR(255) default null
)Engine=InnoDB;

CREATE TABLE category_product (
    category_id int unsigned not null,
    product_id int unsigned not null,
    PRIMARY KEY (category_id, product_id),
    KEY pkey (product_id),
    FOREIGN KEY (category_id) REFERENCES category (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES product (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
)Engine=InnoDB;