Как урезать таблицу с внешним ключом? - 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 ]

1222 голосов
/ 10 ноября 2011

Да, вы можете:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

С помощью этих операторов вы рискуете пустить в таблицы строки, которые не соответствуют ограничениям FOREIGN KEY.

853 голосов
/ 28 марта 2011

Вы не можете TRUNCATE таблицу, к которой применены ограничения FK (TRUNCATE не совпадает с DELETE).

Чтобы обойти это, используйте любое из этих решений. Оба представляют риски нарушения целостности данных.

Вариант 1:

  1. Снять ограничения
  2. Выполнить TRUNCATE
  3. Удалить вручную строки, которые теперь имеют ссылки на нигде
  4. Создание ограничений

Вариант 2: , предложенный user447951 in их ответ

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
142 голосов
/ 24 сентября 2014

Я бы просто сделал это с:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
12 голосов
/ 13 мая 2017

вы можете сделать

DELETE FROM `mytable` WHERE `id` > 0
11 голосов
/ 16 октября 2012

Согласно документации mysql , TRUNCATE не может использоваться в таблицах со связями внешнего ключа.Не существует полной альтернативы AFAIK.

Удаление контринта по-прежнему не вызывает ON DELETE и ON UPDATE.Единственное решение, которое я могу найти в банкомате, это:

  • удалить все строки, удалить внешние ключи, обрезать, воссоздать ключи
  • удалить все строки, сбросить auto_increment (если используется)

Казалось бы, TRUNCATE в MySQL еще не является полной функцией (также не вызывает триггеры). См. Комментарий

6 голосов
/ 22 декабря 2016

Хотя этот вопрос задавался более 5 лет назад, и я не знаю, существовало ли это средство в MySql тогда, но сейчас, если вы используете phpmyadmin , вы можете просто открыть базу данных и затем выбрать таблицу ( s) вы хотите усечь. Внизу есть выпадающий список с множеством опций. Откройте его и выберите параметр Пустой под заголовком Удалить данные или таблицу . Он автоматически переместит вас на следующую страницу, где в флажке есть опция Включить проверки внешнего ключа. Просто отмените выбор и нажмите кнопку Да, и выбранные таблицы будут обрезаны. Может быть, он внутренне выполняет запрос, предложенный в ответе пользователя 447951. Но это очень удобно использовать из интерфейса phpmyadmin.

4 голосов
/ 05 ноября 2018

Легко, если вы используете phpMyAdmin.

Просто снимите флажок Enable foreign key checks на вкладке SQL и запустите TRUNCATE <TABLE_NAME>

enter image description here

4 голосов
/ 24 ноября 2016

Ответ действительно ответ, предоставленный zerkms , как указано в Вариант 1 :

Вариант 1 : который не наносит ущерба целостности данных:

  1. Снять ограничения
  2. Выполнить TRUNCATE
  3. Удалить вручную строки, которые теперь имеют ссылки в никуда
  4. Создание ограничений

Сложная часть: Устранение ограничений , поэтому я хочу рассказать вам, как, в случае, если кто-то должен знать, как это сделать:

  1. Запустите SHOW CREATE TABLE <Table Name> запрос, чтобы увидеть, как вас зовут FOREIGN KEY (красная рамка на изображении ниже):

    enter image description here

  2. Выполнить ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>. Это снимет ограничение внешнего ключа.

  3. Удалите связанный Индекс (через страницу структуры таблицы), и все готово.

для повторного создания внешних ключей:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
2 голосов
/ 25 марта 2019

Просто используйте CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

Но будьте готовы к каскадному удалению)

0 голосов
/ 21 августа 2018

Если ядро ​​базы данных для таблиц отличается, вы получите эту ошибку, поэтому замените их на InnoDB

ALTER TABLE my_table ENGINE = InnoDB;
...