我正在尝试采用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个数据库需要这些更新,并且数据库中以及表中已经有数据。我正在尝试一种方法,任何信息都很棒。
答案 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;