2016-11-04 41 views
0

我有一个网站,有一个非常古老和设计糟糕的数据库(MySQL)。我正在创建一个新版本的网站,我已经定义了另一个数据库(MySQL),当然这是更好的设计(规范化的ea)将数据库复制到另一个数据库与其他结构

现在我有将旧数据库的数据传输到新数据库的问题。我不能使用mysqldump作为表格的布局和引用e.a.是完全不同的,尽管一些属性是相同的。

所以我的问题是什么是这种工作的最佳做​​法。例如。

的表Customer与属性namestreetsomething unimportantCustomer表属性namestreetsomething new and important

什么与外键E.A.表?

亲切的问候

延Buysse的

+1

如果您没有足够小心从当前结构开始并保留'ALTER TABLE'语句,则需要编写自定义数据迁移脚本。没有标准的第三方工具可以帮你。 –

回答

1

有没有真正明确定义这样的方法 - 它更是一个手动任务,确定如何将数据。 ETL(提取,转换和加载)的一种形式。

从您的基表开始,并编写一些插入语句以获取核心数据,并根据情况进行转换。然后转到相关数据的“下一级”并重复,直到您复制了所有信息。

请注意,通常情况下,新的理想模式不能完全实现(包括所有约束等)与遗留数据库,因为某些信息可能会丢失。在这些情况下,您必须a)在加载过程中根据需要生成数据,或者b)关闭约束条件,以便您可以加载旧数据,直到这些数据被清理到足以执行它们。总之,这是一种非常场景的类型,在大多数情况下都倾向于手动处理。无论如何,据我所知,

最后,我和MySQL一起工作已经有一段时间了,但是大多数数据库引擎允许某种类型的两部分命名,所以您可以从一个脚本中访问两个单独的数据库(在同一台服务器上),所以插入语句可能最终这样看:

INSERT INTO newdb.newtable (thisfield, thatfield) 
SELECT thisfield, thatfield FROM olddb.oldtable; 

(应用,当然适用的转换)

1

开始从旧的SQL脚本,并手动删除所有在新的数据库结构不存在不重要列:

INSERT INTO customers ('name','surname','age') VALUES ('john','brown', 27); 

成为

INSERT INTO customers ('name','surname') VALUES ('john','brown'); 

指定一个默认值来插入新的数据库新列,如果需要执行插入脚本之后删除此默认值。

使用一些编辑器,复制/替换生成的脚本使其变得简单。或者将临时表中的旧表复制并从中选择所需的字段以将数据插入到新表中。

INSERT INTO customer (
    SELECT 'name','surname' FROM customers_old 
) 

在这种情况下,一个自动化的方法是很难找到的,因为数据库结构是由您和手动的方法是在我看来,更好地在这里。

+0

MySQL是否有'INSERT INTO thisdb.thistable(fields)SELECT fields from thatdb.thattable' syntax? (我已经使用它已有数年了) – jleach

0

您可以用您选择的语言编写一个程序,将数据从1个DB(表格)移动到另一个,只移动所需的列数据。你可以在网上找到很多相同的例子

为了处理外键方案,你可以将数据从列中移出,由于规范化需要移动到其他表中,你可以通过程序本身作为程序来处理将在该行的每个条目上工作,因此您可以自由地将行中的每个条目移动到您想要的任何表格(或者维护一个临时的Excel表格,其中每个表格表格都是一个表格并根据需要向此Excel中添加数据),然后将数据添加到通过导入它从此Excel中创建的新表架构

相关问题