从多个表中删除mysql记录无法按预期工作

g52tjvyc  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(382)

嗨,伙计们,我正试图从三个表中删除多个记录。然而,它并没有像预期的那样工作。
我的问题:

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;

我的猜测是,当在其他表中找不到记录时,它不会删除记录。我已经尝试了join,但是它只删除了主表中的内容。

kknvjkwl

kknvjkwl1#

最好使用 CASCADE 多个操作的函数,即删除或更新。 CASCADE -如果打开 UPDATE CASCADE 或者 ON UPDATE SET NULL 递归以更新它以前在级联过程中更新过的同一个表,其行为类似于 RESTRICT . 这意味着您不能在更新级联或上使用自引用 UPDATE SET NULL 操作。这是为了防止级联更新产生无限循环。自我参照 ON DELETE SET NULL 另一方面,是可能的,因为是一个自我参照 ON DELETE CASCADE . 级联操作的嵌套深度不能超过15层。
有时,了解哪个表受 MySQL ON DELETE CASCADE 从父表中删除数据时的引用操作。您可以从information\u schema数据库中的引用\u约束中查询此数据,如下所示:
代码:

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

例子:
例如,要查找与具有 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 如果因为某个产品属于某个已被杀死的类别而对其进行核爆,那么您的外键设置不正确。对于示例表,应设置以下表:

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;

相关问题