#mysql #database #reference #foreign-keys
#mysql #База данных #ссылка #внешние ключи
Вопрос:
Я создал таблицу в своей БД, а затем удалил всю таблицу. но теперь я получил ошибку ограничения внешнего ключа для этого идентификатора таблицы. И из-за этого я не могу обновить что-либо другое для своего приложения в local.
В моей базе данных более 400 таблиц с тысячами записей.
Как я могу найти идентификатор ссылки на удаленную таблицу во всех моих текущих таблицах?
Комментарии:
1. Это было бы невозможно, если бы вы не установили foreign_key_checks = false .. Если вы удалили все строки из таблицы (в отличие от удаления таблицы) Я предлагаю вам восстановить эту таблицу из резервной копии и действовать осторожно.
2. Да, я установил foreign_key_checks = false перед удалением этой таблицы и снова установил его в true после удаления. тогда также возникает эта проблема.
3. Вот почему возникла проблема — как я уже сказал, попробуйте восстановить из резервной копии.
4. Я восстановил удаленные таблицы из резервной копии базы данных и восстановил их. Спасибо за ваше предложение. 🙂
Ответ №1:
Вы можете попытаться найти все таблицы, на которые ссылаются для удаленной таблицы, в системной базе данных information_schema
:
SELECT
kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, kcu.COLUMN_NAME,
kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE kcu
WHERE kcu.REFERENCED_TABLE_SCHEMA = 'YourDatabaseName' AND
kcu.REFERENCED_TABLE_NAME = 'YourDeletedTableName'
Комментарии:
1. пользователь14717238, спасибо за ответ и руководство. Но должен ли я каждый раз запускать этот запрос для всех 400 таблиц, заменяя имена таблиц и имена столбцов? это выглядит очень длительным и трудоемким процессом…
2. пользователь14717238, большое вам спасибо за это. Вы сэкономили мое время, и это сработало как шарм. Я получил ограничение ссылки. Еще раз спасибо за это быстрое решение. 🙂
3. @@user14717238 Есть ли способ получить весь идентификатор этой удаленной таблицы из всех таблиц, на которые ссылаются?
4. Вы можете создать SQL-запрос для каждой таблицы, на которую ссылается ссылка, чтобы получить значения столбца, на который ссылается ссылка. Добавьте это выражение к запросу в
SELECT
предложении и посмотрите результат —CONCAT('SELECT ', kcu.COLUMN_NAME, ' FROM ', kcu.TABLE_NAME, ';') AS sql_select
5. И посмотрите, как выполнять подготовленные запросы из динамически создаваемых строковых переменных, если количество таких запросов действительно велико. — dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
Ответ №2:
Вы можете выполнить поиск по всей схеме (DB) из mysql workbench для имени столбца, на который ссылается ссылка, оттуда вы сможете найти все ссылки
Комментарии:
1. Не могли бы вы предоставить какую-либо ссылку? поскольку я использовал Google и не нашел то, что я хочу.