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

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

ERROR 1701 (42000): не mytest таблицу, на которую ссылается ограничение внешнего ключа ( 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; 

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

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

Опция 1:

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

Вариант 2: предложенный пользователем447951 в их ответе

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

Да, ты можешь:

 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table1; TRUNCATE table2; SET FOREIGN_KEY_CHECKS = 1; 

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

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

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

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

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

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

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

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

 DELETE FROM `mytable` WHERE `id` > 0 

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

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

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

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

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

  1. Запустите SHOW CREATE TABLE

    чтобы узнать, каково ваше имя FOREIGN KEY (красная рамка внизу изображения):

    введите описание изображения здесь

  2. Запуск ALTER TABLE

    DROP FOREIGN KEY

    . Это устранит ограничение внешнего ключа.

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

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

 ALTER TABLE  ADD FOREIGN KEY () REFERENCES ();

Получение состояния проверки старого внешнего ключа и режима 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; 

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

 ALTER TABLE my_table ENGINE = InnoDB; 
  • Как использовать интерфейс как ограничение типа C #?
  • Как добавить ненулевое ограничение существующего столбца в MySQL5.1
  • Операция «Вставить, если не существует» в SQLite
  • Решение для перегруженного ограничения оператора в .NET-дженериках
  • Почему это обобщенное ограничение компилируется, когда оно, кажется, имеет круговую ссылку
  • Любопытно повторяющиеся шаблоны шаблонов и ограничений генериков (C #)
  • Есть ли общее ограничение, которое я мог бы использовать для оператора +?
  • Уникальное ограничение, позволяющее пустым значениям в MySQL
  • Ограничение для предотвращения вставки пустой строки в MySQL
  • Существует ли ограничение на C # для типов «реального числа»?
  • Общие ограничения, где T: struct и где T: class
  • Давайте будем гением компьютера.