MySQL создает или обновляет на основе определения таблицы

#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;