Почему не работает TRUNCATE на mygroup
?
Даже если у меня есть ON DELETE CASCADE SET
, я получаю:
ОШИБКА 1701 (42000): не удается обрезать таблицу, на которую ссылается ограничение внешнего ключа (
mytest
.instance
, CONSTRAINTinstance_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;
Вы не можете TRUNCATE
таблицу с ограничениями FK, применяемыми к ней (TRUNCATE
не совпадает с DELETE
).
Чтобы обойти это, используйте любое из этих решений. Оба представляют опасность повреждения целостности данных.
Вариант 1:
TRUNCATE
Вариант 2:, предложенный user447951 в их ответе
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;
DELETE
работает медленнее, чем TRUNCATE
. Но так как это действие обычно выполняется очень редко, это не имеет значения.
Согласно документации mysql, TRUNCATE не может использоваться в таблицах с отношениями внешнего ключа. Нет полной альтернативы AFAIK.
Отбрасывание контраста по-прежнему не вызывает ВКЛ. УДАЛЕНИЕ и ОБНОВЛЕНИЕ. Единственное решение, которое я могу использовать ATM, - это либо:
Казалось бы, TRUNCATE в MySQL еще не является полной функцией (он также не вызывает триггеры).
См. Комментарий
TRUNCATE
является неполным - truncate не должен вызывать триггеры и т. Д. Если это так, то это будет то же самое, что и DELETE
! Он не зависит от строки, поэтому не может выполнять операции, связанные со строками (например, вызывать триггеры или проверять внешние ключи). Аналогичным образом работает в Oracle и Sql Server .
вы можете сделать
DELETE FROM `mytable` WHERE `id` > 0
Хотя этот вопрос был задан более 5 лет назад, и я не знаю, что это средство существовало в MySql, но теперь, если вы используете phpmyadmin, вы можете просто открыть базу данных, а затем выбрать таблицу (ы), которые вы хотите усечь. Внизу есть выпадающее меню со многими опциями. Откройте его и выберите Пустой вариант под заголовком Удалить данные или таблицу. Он автоматически переместит вас на следующую страницу, где есть опция в флажке "Включить проверки внешнего ключа". Просто отмените выбор и нажмите кнопку "Да", и выбранная таблица (таблицы) будет усечена. Может быть, он внутренне выполняет запрос, предложенный в user447951. Но это очень удобно использовать из интерфейса phpmyadmin.
Ответ действительно тот, который предоставляется zerkms, как указано в Вариант 1:
Вариант 1: это не повредит целостности данных:
- Удалить ограничения
- Выполнить TRUNCATE
- Удалить вручную строки, которые теперь ссылаются на нигде
- Создать ограничения
Сложная часть Удаление ограничений, поэтому я хочу рассказать вам, как, если кто-то должен знать, как это сделать:
Запустите запрос SHOW CREATE TABLE <Table Name>
, чтобы узнать, каково ваше имя FOREIGN KEY (красная рамка внизу):
Запустите ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Это устранит ограничение внешнего ключа.
Отсоедините связанный Индекс (через страницу структуры таблицы), и все готово.