it-swarm.com.ru

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

ПочемуУСЕЧЕНИЕна 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;
537
user391986

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

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

Опция 1:

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

Вариант 2: _ ​​предложено user447951 в их ответ

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

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

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

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

1165
user447951

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

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
136
George Garchagudashvili

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

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

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

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

11
Omer Sabic

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

DELETE FROM `mytable` WHERE `id` > 0
10
Ali Sadran

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

6
Rolen Koh

Ответ действительно тот, который предоставляется 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. Удалите связанный Index (через страницу структуры таблицы), и все готово.

воссоздать внешние ключи:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
3
Trix

Просто используйте КАСКАД

TRUNCATE "products" RESTART IDENTITY CASCADE;

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

1
Alexus1024

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

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

 enter image description here

1
Ajmal Salim

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

ALTER TABLE my_table ENGINE = InnoDB;
0
sajad abbasi

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