【问题标题】:MySQL delete join on multiple tables all matching recordsMySQL删除多个表上所有匹配记录的连接
【发布时间】:2020-04-17 04:51:52
【问题描述】:

我创建了一个从 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;

【问题讨论】:

  • 请将表格形式的源数据替换为他们的 CREATE TABLE + INSERT INTO 脚本。并显示所需的最终数据状态。
  • @Akina 添加 sql 创建表
  • 只是为了观察这些有时被称为国家和州/省

标签: mysql sql


【解决方案1】:

您必须在删除前禁用外键检查才能达到预期的效果。

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;

fiddle

【讨论】:

  • 我也可以通过交易实现同样的目标。您对这种方法有何看法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多