Как получить все таблицы со связанными данными для значения ForeignKey в MySQL - PullRequest
3 голосов
/ 23 октября 2019

У меня много таблиц. В каждой таблице есть user_id как foreign_key, указывающий на user.id (пользовательская таблица, первичный ключ). Это для записи, какой пользователь вставил / изменил данные.

Теперь я хочу знать, в какие таблицы пользователь вставил данные.

Есть ли простой трюк без объединения всех таблиц?

  • Я не ожидаю данных (могу запросить позже)
  • Мне не нужно знать, на какие таблицы foreign_key указывает на пользовательскую таблицу (я уже знаю)
  • Я хочучтобы знать, где связаны пользовательские данные

Я мог бы объединить все таблицы, но это было бы огромной проблемой производительности. Столов много, а некоторые большие.

Я ищу что-то вроде:

SELECT tablename 
FROM information_schema.foo 
WHERE foreign_key = "key_name" AND foreign_key_value = 2;

1 Ответ

2 голосов
/ 23 октября 2019

Я не думаю, что есть какой-либо прямой путь, но вы можете использовать information_schema.key_column_usage для создания запросов для вас.

SELECT 
  concat('select \'',TABLE_NAME,
  '\' as `in_table`, IF (',COLUMN_NAME,' IS NOT NULL, \'Present\', \'Absent\') as exist from ',
 TABLE_NAME, ' where ', COLUMN_NAME, ' = 2; ') as `query`
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = 'testdb' AND
  REFERENCED_TABLE_NAME = 'users';

Теперь у вас есть запрос выше, который будет возвращать запросы для каждой таблицы для user-id = 2. Вы можете создать процедуру, которая будет принимать идентификатор пользователя в качестве аргумента и затем выполнять вышеуказанный запрос.

Перебирать результат примерно так:

select 'employees' as `in_table`, IF (user_id IS NOT NULL, 'Present', 'Absent') as exist from employees where user_id = 2; 
select 'profile_documents' as `in_table`, IF (user_id IS NOT NULL, 'Present', 'Absent') as exist from profile_documents where user_id = 2; 

и выполнять их один за другим.

Затем используйте процедуру, чтобы вернуть имена таблиц, в которых присутствует информация о пользователе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...