Как урезать таблицу с внешним ключом?
Почему не работает 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: который не угрожает нарушению целостности данных:
- Удалить ограничения
- Выполнить TRUNCATE
- Удалите вручную строки, которые теперь имеют ссылки в никуда
- Создать ограничения
Самое сложное - Снятие ограничений, поэтому я хочу рассказать вам, как, если кому-то нужно знать, как это сделать:
Запустите запрос SHOW CREATE TABLE <Table Name>
, чтобы узнать, как вас зовут ИНОСТРАННЫЙ КЛЮЧ (красная рамка на изображении ниже):
![enter image description here]()
Запустите ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Это снимет ограничение внешнего ключа.
Удалите связанный индекс (через страницу структуры таблицы), и все готово.
воссоздать внешние ключи:
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;