我的网站设计非常古老且设计糟糕的数据库(MySQL)。我正在创建一个新版本的网站,我已经定义了另一个数据库(MySQL)当然是更好的设计(标准化的e.a.)
现在我遇到了将旧数据库的数据传输到新数据库的问题。我不能使用mysqldump作为表和引用的布局e.a.完全不同,虽然有些属性是相同的。
所以我的问题是这种工作的最佳实践是什么。 E.g。
包含属性Customer
,name
,street
到新something unimportant
表格且Customer
,name
的表格street
something new and important
使用外键的表怎么样? ?
亲切的问候
Jens Buysse
答案 0 :(得分:1)
这样做的方法并不是很明确 - 它更像是一个手动任务,定义了如何转换数据。一种形式的ETL(提取,转换和加载)原样。
从基表开始并编写一些insert语句以获取核心数据,并根据需要进行转换。然后转到相关数据的“下一级”并重复,直到复制完所有信息。
请注意,由于某些信息可能会丢失,因此通常无法使用旧数据库完全实现新的理想架构(具有所有约束等)。在这些情况下,您必须a)在加载期间根据需要生成数据,或者b)关闭约束,以便您可以加载旧数据,直到这些数据被清理到足以强制执行它们为止。
总而言之,在大多数情况下,这是一种非常适合的情景类型,往往会手动处理。据我所知,无论如何。
最后,自从我使用MySQL以来已经有一段时间了,但是大多数数据库引擎允许某种类型的两部分命名,因此您可以从单个脚本中访问两个单独的数据库(在同一服务器上),因此insert语句可能最终看起来像这样:
INSERT INTO newdb.newtable (thisfield, thatfield)
SELECT thisfield, thatfield FROM olddb.oldtable;
(当然应用适用的转换)
答案 1 :(得分: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
)
在这种情况下很难找到自动化方法,因为数据库结构由您制作,我认为手动方法更好。
答案 2 :(得分:0)
您可以用您选择的语言编写一个程序,将数据从1个DB(表)移动到另一个,只需要移动所需的列数据。你可以在网上找到很多相同的例子
要处理外键场景,您可以从列中移动数据,由于规范化需要移动到其他表,您可以使用程序本身处理这个,因为程序将对该行的每个条目起作用,因此您可以自由将行中的每个条目移动到您想要的任何表(或维护一个临时的Excel工作表,其中每个工作表代表一个表并根据需要向此excel添加数据)然后通过导入将该数据从此excel添加到新创建的表模式中< / p>