MySQL根据表定义创建或更新

时间:2019-04-15 20:25:36

标签: mysql

我正在尝试采用mysql表架构,然后针对其他表运行它并进行更新或创建。例如,假设我有像这样的表def

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;

现在在另一个数据库上,我想要完全相同的架构表。在某些情况下,该表可能根本不存在(因此我需要添加它),在其他情况下,它可能具有表但可能缺少键,或者它可能具有所有内容,但值可能不同(varchar长度更改为实例)。

我大约有1000个数据库需要这些更新,并且数据库中以及表中已经有数据。我正在尝试一种方法,任何信息都很棒。

2 个答案:

答案 0 :(得分:0)

您可能需要一种编程语言来帮助您完成此过程,但这可能是使用此查询的一种方式

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

答案 1 :(得分:0)

您可能希望查询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;