Как урезать таблицу с внешним ключом?

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

ОШИБКА 1701 (42000): не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа (mytest. instance, CONSTRAINT instance_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (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;

Ответ 1

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

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

Вариант 1:

  • Удалить ограничения
  • Выполнить TRUNCATE
  • Удалить вручную строки, которые теперь имеют ссылки на нигде
  • Создать ограничения

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

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;

Ответ 2

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

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

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

Ответ 3

Я бы просто сделал это с помощью

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;

Ответ 4

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

DELETE FROM `mytable` WHERE `id` > 0

Ответ 5

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

Отбрасывание контраста по-прежнему не вызывает ВКЛ. УДАЛЕНИЕ и ОБНОВЛЕНИЕ. Единственное решение, которое я могу использовать ATM, - это либо:

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

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

Ответ 6

Пока задавался этот вопрос, я не знал об этом, но теперь, если вы используете phpMyAdmin, вы можете просто открыть базу данных и выбрать таблицы, которые вы хотите обрезать.

  • Внизу есть выпадающий список с множеством вариантов. Откройте его и выберите опцию Empty под заголовком Delete data or table.
  • Он автоматически переместит вас на следующую страницу, где в флажке есть опция под названием Enable foreign key checks. Просто отмените выбор и нажмите кнопку Yes, и выбранные таблицы будут обрезаны.

Возможно, он выполняет внутренний запрос, предложенный в ответе user447951, но его очень удобно использовать из интерфейса phpMyAdmin.

Ответ 7

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

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

enter image description here

Ответ 8

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

Вариант 1: который не угрожает нарушению целостности данных:

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

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

  1. Запустите запрос SHOW CREATE TABLE <Table Name>, чтобы узнать, как вас зовут ИНОСТРАННЫЙ КЛЮЧ (красная рамка на изображении ниже):

    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>);

Ответ 9

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

TRUNCATE "products" RESTART IDENTITY CASCADE;

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

Ответ 10

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

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;'
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;

Ответ 11

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

ALTER TABLE my_table ENGINE = InnoDB;