【发布时间】:2015-10-27 10:41:10
【问题描述】:
我有一个数据库,我们在我的计算机上简单地称它为“db”,其中有几个表,这些表中有多个列和这些表中的数据。 我有一个软件使用这个数据库来存储配置元素和其他一些东西。
现在,我发布了我的软件的新版本,仅对数据库进行了轻微修改,即某些列可能已添加到表中,或已删除(但没有重命名列)。
我必须保留所有数据,因此我想将其转移到我的数据库的新“版本”中。
我的想法:
- 将“db”重命名为“db_old”。
- 将新数据库安装为“db_new”,并在新列中使用默认值
- 对于每个表,获取 'db_old' 中存在于 'db_new' 中的所有列的列表
- 使用 INSERT INTO ... SELECT 将旧内容放回“db_new”。
- 删除旧数据库并使用我的新数据库。
你认为它可以工作吗?你有什么简单的解决办法吗?
另外,我绝对不是 SQL 专家...我试过这个(没有查看该列是否已被删除):
SELECT
GROUP_CONCAT(COLUMN_NAME
SEPARATOR ',')
INTO @colList FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'db_old'
AND TABLE_NAME = 'configuration';
INSERT
INTO db_new.configuration (SELECT @colList)
SELECT @colList FROM
db_old.configuration;
但是用有效列表替换第二个@colList 失败了......你也可以在这个问题上帮助我吗?
谢谢大家,祝你有美好的一天!
【问题讨论】:
-
旧表中的列是否与新表中的列匹配?
-
新表可能有新列,部分列可能已被删除。但是共同的列具有相同的名称。但是,如果这太复杂了,我们就说新表可能只有新列,而没有删除任何列。
-
您应该能够将其保留为简单的
insert into语句。我最近不得不做同样的事情。INSERT INTO database2.table (column_name(s)) SELECT (column_name(s)) FROM database1.table将数据插入新数据库并将新列保留为空白/空 -
非常感谢。我设法做到了只添加列的情况。我的代码是:
SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') INTO @var1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'Table1'; SELECT @var1; SET @execut = CONCAT("INSERT INTO db2.Table2(", @var1, ") SELECT ", @var1, " FROM db1.Table1"); PREPARE stmt FROM @execut; EXECUTE stmt;诀窍就是使用语句... -
好的,谢谢! :) 现在我只需要编写一个小例程来用两个表中都存在的列名填充变量,第二种情况将完成。我想我可以自己解决这个问题,再次感谢您! :)