从多个表中删除 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 CASCADE
或 ON 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;
大家好,我正在尝试从三个 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 CASCADE
或 ON 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;