MySQL удалить объединение в нескольких таблицах всех соответствующих записей - PullRequest
0 голосов
/ 16 апреля 2020

Я создал объединение удаления, которое удаляет из 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) удалять обе записи в таблице статистики (потому что у меня есть внешний ключ для региона и sub_region, который каскадируется при удалении) 2) удалить регион из таблицы регионов, соответствующий region_id 3) удаляет только 1 запись из таблицы sub_region

Мне нужен запрос для удалите все подрегионы, если он снова совпадает с region_id в таблице статистики.

Любые мысли приветствуются.

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;

1 Ответ

0 голосов
/ 16 апреля 2020

Вы должны отключить проверку внешнего ключа перед удалением для достижения желаемого результата.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...