mysql 使用SQL将SQL数据库数据从旧结构移动到新结构

hwamh0ep  于 2023-01-29  发布在  Mysql
关注(0)|答案(2)|浏览(169)

我正在规范一个MySQL数据库。我设计了一个新的结构。
如何使用SQL将数据库数据从旧结构移动到新结构?

tpxzln5u

tpxzln5u1#

下面是一个在脚本中规范化表的例子。我建议你这样做

e.g Table: tbl_tmpData
Date, ProductName, ProductCode, ProductType, MarketDescription, Units, Value
2010-01-01, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 1', 20, 20.00
2010-01-02, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 2', 40, 40.00
2010-01-03, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 3', 40, 40.00
2010-01-01, 'Cola', '02', 'Drink', 'Store 1', 40, 80.00
2010-01-02, 'Cola', '02', 'Drink', 'Store 2', 20, 40.00
2010-01-03, 'Cola', '02', 'Drink', 'Store 2', 60, 120.00
2010-01-01, 'Simiri Gum', '03', 'Gum', 'Store 1', 40, 80.00
2010-01-02, 'Simiri Gum', '03', 'Gum', 'Store 2', 20, 40.00
2010-01-03, 'Simiri Gum', '03', 'Gum', 'Store 3', 60, 120.00

您将首先创建您的日期表:

CREATE TABLE tbl_Date
(
DateID int PRIMARY KEY IDENTITY(1,1)
 ,DateValue datetime
)

INSERT INTO tbl_Date (DateValue)
SELECT DISTINCT Date
FROM tbl_Data
WHERE Date NOT IN (SELECT DISTINCT DateValue FROM tbl_Date)

然后创建市场表

CREATE TABLE tbl_Market
(
MarketID int PRIMARY KEY IDENTITY(1,1)
 ,MarketName varchar(200)
)

INSERT INTO tbl_Market (MarketName)
SELECT DISTINCT MarketDescription
FROM tbl_tmpData
WHERE MarketName NOT IN (SELECT DISTINCT MarketDescription FROM tbl_Market)

然后创建ProductType表

CREATE TABLE tbl_ProductType
(
ProductTypeID int PRIMARY KEY IDENTITY(1,1)
 ,ProductType varchar(200)
)

INSERT INTO tbl_ProductType (ProductType)
SELECT DISTINCT ProductType
FROM tbl_tmpData
WHERE ProductType NOT IN (SELECT DISTINCT ProductType FROM tbl_ProductType)

然后创建Product表

CREATE TABLE tbl_Product
(
ProductID int PRIMARY KEY IDENTITY(1,1)
, ProductCode varchar(100)
, ProductDescription varchar(300)
 ,ProductType int
)

INSERT INTO tbl_Product (ProductCode, ProductDescription, ProductType)
SELECT DISTINCT tmp.ProductCode,tmp.ProductName, pt.ProductType
FROM tbl_tmpData tmp
INNER JOIN tbl_ProductType pt ON tmp.ProductType = pt.ProductType
WHERE ProductCode NOT IN (SELECT DISTINCT ProductCode FROM tbl_Product)

然后创建数据表

CREATE TABLE tbl_Data
(
DataID int PRIMARY KEY IDENTITY(1,1)
, DateID varchar(100)
, ProductID varchar(100)
, MarketID varchar(300)
 ,Units decimal(10,5)
 , value decimal(10,5)
)

INSERT INTO tbl_Data (ProductID, MarketID, Units, Value)
SELECT t.DateID
       , p.ProductID
       , m.MarketID
       , SUM(tmp.Units)
       , SUM(tmp.VALUE)
FROM tbl_tmpData tmp
INNER JOIN tbl_Date t ON tmp.Date = t.DateValue
INNER JOIN tbl_Product p ON tmp.ProductCode = p.ProductCode
INNER JOIN tbl_Market m ON tmp.MarketDescription = m.MarketName 
GROUP BY t.DateID, p.ProductID, m.MarketID
ORDER BY t.DateID, p.ProductID, m.MarketID
l7wslrjt

l7wslrjt2#

我最近做了这件事,对一般程序如何执行有了一些见解。
1.从数据建模开始。当您开始使用未规范化的数据库时,您需要创建一个适当的模型,以便将数据传输到该模型中。这包括标识应存在于其自己的表中的原子对象。标识重复数据并确定其位置。还要标识数据结构中存在的所有关系。
可选步骤。数据库通常与可能也需要更新的接口一起使用。在此步骤中也查看该设计,并决定在数据结构和接口程序中是否有任何孤立的部分可以等待。应该包括多少取决于实际方面,如时间和预算。也许有些部分还不需要修改。
也可以选择完全从头开始,跳过向后兼容性,让两个系统并行运行
1.编写一个脚本,添加规范化数据所需的所有新列和表。
1.编写另一个脚本,将非规范化数据传输到新的规范化数据结构中,这是我认为最棘手的部分,可能会相当混乱,这取决于旧数据的糟糕程度。
1.通过向新的表和列添加约束,对新的规范化数据实施模型中的所有约束。这也最好在脚本中完成。在脚本中,您将看到数据迁移是否成功。如果成功,您将能够添加所有约束。如果失败,则某些约束将失败,您将不得不返回并查看失败的约束。
1.最后,创建另一个脚本,删除新模型中删除的所有列和表。通过这样做,您将很容易地确定界面中需要更新的所有位置。与这些列和表中的任何内容相关的任何内容都必须在界面中更新。
一些通用的技巧是在数据库的一个副本上进行所有的开发,也许是缩减的副本。例如,在MySQL中,你可以使用Workbench等工具进行SQL转储,并在其上测试脚本。在迁移工作之前,你可能需要在数据库上进行几次迭代。在连接中,也要在数据库的一个副本上进行实际迁移,不要破坏生产中的任何东西。

相关问题