#mysql
#mysql
Вопрос:
Я пытаюсь взять схему таблицы mysql, а затем запустить ее против других таблиц и либо обновить, либо создать. Так, например, допустим, у меня есть определение таблицы следующим образом
CREATE TABLE `mobileKeys` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`key` varchar(40) NOT NULL DEFAULT '',
`expiration` datetime NOT NULL,
`generated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
Теперь в другой базе данных мне нужна точно такая же таблица схемы. В некоторых случаях таблица может вообще не существовать (поэтому мне нужно ее добавить), в других случаях в ней может быть таблица, но может отсутствовать ключ, ИЛИ в ней может быть все, но значения могут отличаться (например, изменена длина переменной).
У меня около ~ 1000 БД, которые нуждаются в этих обновлениях, и у меня уже есть данные в БД и, возможно, таблицы. Я пытаюсь придумать способ сделать это, любая информация была бы отличной.
Комментарии:
1. Если вы запустите
CREATE TABLE IF NOT EXISTS
, вы завершите создание таблицы. Обновление сложно, если вы точно не знаете, что делать с таблицей — я не уверен, как вы можете использоватьALTER TABLE
для добавления столбцов, если вы заранее не знаете, какие столбцы вам нужно добавить. То же самое относится и к обновлению столбцов.
Ответ №1:
Возможно, вам понадобится язык программирования, чтобы помочь вам в этом процессе, но это может быть способ использовать этот запрос
SELECT column_name
FROM information_schema.columns
WHERE table_schema='[your database name]'
AND table_name='[your table name]'
AND column_name NOT IN ('column A', 'column B')
С помощью этого вы можете получить недостающие столбцы и создать «настраиваемую таблицу изменений».
И после исправления таблицы вы можете просто синхронизировать разные базы данных
INSERT INTO databaseX.table_A(column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM databaseY.table_A
Ответ №2:
Возможно, вы захотите изучить запрос information_schema
, чтобы узнать, существуют ли таблицы или столбцы. information_schema легко запрашивается и содержит всю информацию о ваших схемах БД.
Вы можете проверить, существует ли такая таблица:
SELECT *
FROM information_schema.tables
WHERE table_name = 'your_table'
AND table_schema = 'your_db';
Вы можете получить список всех столбцов, а также их типы данных из таблицы columns:
SELECT *
FROM information_schema.columns
WHERE table_name = 'your_table'
AND table_schema = 'your_db'
Вы даже можете узнать, сколько данных содержится в каждой таблице в базе данных, используя information_schema:
SELECT CONCAT(table_schema, '.', table_name) AS table_name,
CONCAT(ROUND(table_rows / 1000000, 2), 'M') AS rows_readable,
CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') AS total_data,
CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') AS idx,
CONCAT(ROUND(( data_length index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') AS total_size,
ROUND(index_length / data_length, 2) AS idxfrac
FROM information_schema.tables
WHERE table_schema = 'your_db'
-- order by data_length desc
-- order by table_rows desc
ORDER BY data_length index_length DESC;