Как урезать таблицу с внешним ключом? - PullRequest
569 голосов
/ 28 марта 2011

Почему TRUNCATE на mygroup не работает? Даже если у меня есть ON DELETE CASCADE SET, я получаю:

ОШИБКА 1701 (42000): невозможно усечь таблицу, на которую ссылается ограничение внешнего ключа (mytest. instance, CONSTRAINT instance_ibfk_1 FOREIGN KEY (GroupID) ССЫЛКИ mytest. mygroup (ID))

drop database mytest;
create database mytest;
use mytest;

CREATE TABLE mygroup (
   ID    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE instance (
   ID           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   GroupID      INT NOT NULL,
   DateTime     DATETIME DEFAULT NULL,

   FOREIGN KEY  (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
   UNIQUE(GroupID)
) ENGINE=InnoDB;

Ответы [ 11 ]

0 голосов
/ 15 декабря 2017

Получение старого состояния проверки внешнего ключа и режима sql - лучший способ усекать / отбрасывать таблицу, как это делает Mysql Workbench при синхронизации модели с базой данных.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
...