mysql - MySQL删除多个表上所有匹配记录的连接
问题描述
我创建了一个从 2 个表中删除的删除连接,但目前它只匹配并删除其中一个连接表中的第一条记录:
delete srid, rid from sub_region as srid
join statistics s
on srid.sub_region_id = s.sub_region_id
join region as rid
on rid.region_id = s.region_id
where s.region_id = 1;
region table:
id, region
1 america
2 mexico
3 canada
sub_region table:
id, sub_region
1 texas
2 new york
statistics table:
id, region_id, sub_region_id, text_description
1 1 1 texas has pretty good bbq
2 1 2 new york is a concrete jungle
我的查询将:1)删除统计表中的两条记录(因为我在 region 和 sub_region 上有一个外键,删除时级联)2)从匹配 region_id 的区域表中删除区域 3)只从 sub_region 表中删除 1 条记录
如果再次匹配统计表中的 region_id,我需要查询删除所有 sub_regions。
任何想法表示赞赏。
SQL:
-- -----------------------------------------------------
-- Table `region`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `region` (
`region_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`region` VARCHAR(255) NULL,
PRIMARY KEY (`region_id`),
UNIQUE INDEX `region_id_UNIQUE` (`region_id` ASC) VISIBLE,
UNIQUE INDEX `region_UNIQUE` (`region` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `sub_region`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `sub_region` (
`sub_region_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`sub_region` VARCHAR(255) NULL,
PRIMARY KEY (`sub_region_id`),
UNIQUE INDEX `sub_region_id_UNIQUE` (`sub_region_id` ASC) VISIBLE,
UNIQUE INDEX `sub_region_UNIQUE` (`sub_region` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `statistics`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `statistics` (
`statistics_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`region_id` INT UNSIGNED NULL,
`sub_region_id` INT UNSIGNED NULL,
`text_description` VARCHAR(255) NULL,
PRIMARY KEY (`statistics_id`),
UNIQUE INDEX `statistics_id_UNIQUE` (`statistics_id` ASC) VISIBLE,
INDEX `fk_region_statistics_idx` (`region_id` ASC) VISIBLE,
INDEX `fk_sub_region_statistics_idx` (`sub_region_id` ASC) VISIBLE,
CONSTRAINT `fk_region_statistics`
FOREIGN KEY (`region_id`)
REFERENCES `region` (`region_id`)
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_sub_region_statistics`
FOREIGN KEY (`sub_region_id`)
REFERENCES `sub_region` (`sub_region_id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;
解决方案
您必须在删除之前禁用外键检查才能获得所需的结果。
SET @@foreign_key_checks := 0;
DELETE region, sub_region
FROM statistics
JOIN region USING (region_id)
JOIN sub_region USING (sub_region_id)
WHERE region_id = 1;
SET @@foreign_key_checks := 1;
见小提琴
推荐阅读
- form-recognizer - Azure 表单识别器。将 v1.0-preview 自定义模型迁移到 v2.0
- python-3.x - 如何在默认情况下激活 anaconda 中的环境?
- php - 防止 Intercom API 在发送消息时重写链接
- c# - 从多个字符串中删除最后一个空格之后的整个字符集
- python - 如何从我的 python 应用程序将用户名和密码存储在 SQLite 数据库中?
- c# - 使用 TAP 进行多任务处理
- xml - 计算父元素并在字符串 XSLT 2 中返回它们
- r - 为ggplot2中的每个图例分配不同的背景颜色
- python - 如何继承 Odoo 12 中的 One2many 字段?
- python - 如何使用 Python 从一行文本中提取所需的文本?