Mysql

將 MySql 表拆分為具有一對多關係的兩個表

  • June 5, 2014

我在 MySql 中有一個舊的數據庫表。它用於儲存來自線上電子商務的訂單。簡化圖如下所示:

+----+------+-----------------------+-------+--------------+
| id | name | address               | phone | order_number |
+----+------+-----------------------+-------+--------------+
|  1 | Joe  | Joes Address          | 1111  | 1390842      |
|  2 | Paul | Pauls Address         | 2222  | 9082309      |
|  3 | Greg | Gregs Address         | 3333  | 0928340      |
|  4 | Lucy | Lucys Address         | 4444  | 9028340      |
|  5 | Paul | Pauls Address         | 2222  | 8958399      |
|  6 | Tom  | Toms Address          | 5555  | 9084024      |
|  7 | Lucy | Lucys Another Address | 4444  | 9801983      |
|  8 | Paul | Pauls Another Address | 2222  | 0982304      |
+----+------+-----------------------+-------+--------------+

每個訂單都有一個單獨的姓名地址和電話號碼。一些客戶下訂單 2 次或更多次(Lucy 和 Paul)。保羅住在 Pauls Address 時下了兩份訂單,搬到 Pauls Another Address 時下了一份訂單。露西搬家後下了一個訂單,然後又下了一個訂單。

我需要做的是把這張表分成兩張表。一個表是 user_account 表,它只保存姓名和電話號碼,而另一張表將保存地址,並通過 FK 與 users_account 相關聯。

user_accounts 應如下所示:

+----+------+-------+    
| id | name | phone |
+----+------+-------+
|  1 | Joe  | 1111  |
|  2 | Paul | 2222  |
|  3 | Greg | 3333  |
|  4 | Lucy | 4444  |
|  5 | Tom  | 5555  |
+----+------+-------+

而地址應如下所示:

+----+-----------------------+-----------------+
| id | address               | user_account_id |
+----+-----------------------+-----------------+
|  1 | Joes Address          | 1               |
|  2 | Pauls Address         | 2               |
|  3 | Gregs Address         | 3               |
|  4 | Lucys Address         | 4               |
|  5 | Toms Address          | 5               |
|  6 | Lucys Another Address | 4               |
|  7 | Pauls Another Address | 2               |
+----+-----------------------+-----------------+

我將如何從我的舊單表中生成這兩個表。任何幫助表示讚賞。我完全堅持這一點,甚至不確定我應該在Google中尋找什麼查詢來為我指明正確的方向。原始表中有大約 100k 行。

PS。

我想根據正常表中不同的電話號碼創建 user_accounts 表。

沒有足夠的時間來測試或寫出所有的表創建,但這是一個開始……

首先創建表來保存使用者。您可以從以下查詢中獲取數據。我不知道您想如何處理的一件事是,如果使用者存在不同的電話號碼。

SELECT DISTINCT name
 , phone
FROM old_table

在您擁有 user_accounts 表後,將其加入 old_table 以獲取地址和新使用者 ID。

SELECT DISTINCT a.address
 , b.id
FROM old_table a
INNER JOIN user_accounts b on a.name = b.name and a.phone = b.phone

引用自:https://dba.stackexchange.com/questions/66695