Почему не TRUNCATE на mygroup
работе? Даже если у меня есть, ON DELETE CASCADE SET
я получаю:
ОШИБКА 1701 (42000): Невозможно обрезать таблицу, на которую ссылается ограничение внешнего ключа (
mytest
.instance
, CONSTRAINTinstance_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;
mysql
foreign-keys
constraints
truncate
dml
user391986
источник
источник
Да, ты можешь:
Используя эти операторы, вы рискуете пустить в таблицы строки, которые не соответствуют
FOREIGN KEY
ограничениям.источник
;
). Это связано с тем, что каждый новый веб-вызов SQL сбрасываетсяFOREIGN_KEY_CHECKS
до 1.Я бы просто сделал это с:
источник
DELETE
работает медленнее, чемTRUNCATE
. Но так как это действие обычно выполняется очень редко, это не имеет значения.DELETE
может быть абсолютно жестоким, если у вас слишком много строк - поскольку он попадает в журналы, тогда какTRUNCATE
просто вырывает данные. Действительно зависит от варианта использования.error 1175: You are using safe update mode,...
изменении предложения delete, чтобыDELETE FROM mydb.mytable where id != 0
сделать его идеальным.ты можешь сделать
источник
mytable
Согласно документации mysql , TRUNCATE не может использоваться в таблицах с отношениями внешнего ключа. Там нет полной альтернативы AFAIK.
Удаление контринта все равно не вызывает ON DELETE и ON UPDATE. Единственное решение, которое я могу найти в банкомате, это либо:
Казалось бы, TRUNCATE в MySQL еще не является полной функцией (он также не вызывает триггеры).Смотрите комментарийисточник
TRUNCATE
является неполным - truncate не должен вызывать триггеры и т. Д. Если бы это произошло, это было бы так же, какDELETE
! Он не зависит от строки, поэтому не может выполнять операции со строками (например, запуск триггеров или проверка внешних ключей). Аналогичным образом работает в Oracle и Sql Server .Легко, если вы используете phpMyAdmin.
Просто снимите флажок
Enable foreign key checks
подSQL
вкладкой и запуститеTRUNCATE <TABLE_NAME>
источник
Пока задавался этот вопрос, я не знал об этом, но теперь, если вы используете phpMyAdmin, вы можете просто открыть базу данных и выбрать таблицы, которые вы хотите обрезать.
Empty
опцию под заголовкомDelete data or table
.Enable foreign key checks
. Просто отменитеYes
выбор и нажмите кнопку, и выбранные таблицы будут обрезаны.Возможно, он внутренне выполняет запрос, предложенный в ответе пользователя 447951 , но его очень удобно использовать из интерфейса phpMyAdmin.
источник
Проверено на базе данных MYSQL
Решение 1:
Решение 2:
Это работает для меня. Надеюсь, это вам тоже поможет. Спасибо, что задали этот вопрос.
источник
Ответ, действительно, предоставлен zerkms , как указано в варианте 1 :
Самое сложное - это удалить ограничения , поэтому я хочу рассказать вам, как, если кому-то нужно знать, как это сделать:
Запустите
SHOW CREATE TABLE <Table Name>
query, чтобы увидеть, как называется ваш FOREIGN KEY (красная рамка на изображении ниже):Беги
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Это снимет ограничение внешнего ключа.Удалите связанный индекс (через страницу структуры таблицы), и все готово.
воссоздать внешние ключи:
источник
Просто используйте КАСКАД
Но будьте готовы к каскадному удалению)
источник
Если ядро базы данных для таблиц отличается, вы получите эту ошибку, поэтому замените их на InnoDB
источник
Получение старого состояния проверки внешнего ключа и режима sql - лучший способ усекать / отбрасывать таблицу, как это делает Mysql Workbench при синхронизации модели с базой данных.
источник