2013-11-14 27 views
1

嘿:我正在嘗試進行MySql遷移,但是我對這個語言非常陌生,並且語法正在幫助我。什麼我想要做的基本思路是:MySql:在一個新表中爲不同表中的每個現有行創建行

- 獲得所有表1

的事件 - 對於這些事件中,插入一行到ticketing_information表(這些有一個自動生成的ID)

- 設置事件的ticketing_information_id以匹配新生成的行

在ID(再次然後同爲表2和表3)

所以我對各個步驟可能是如何工作的想法,但我不是蘇重新如何在sql中結合各種表達式(是否有foreach?我如何挑選我剛剛製作的特定行,如果我對它沒有任何特別的瞭解可以識別它?)

+0

好吧從table1中獲取想法,但是從哪裏獲取ticketing_information的其餘數據? –

+0

儘管最初的語法可能有點令人困惑,但MySQL的SQL與您在其他數據庫中使用的SQL類型非常相似,所以這是一項投資,將來會帶來收益。一般來說,你對SQL有很好的參考嗎? – tadman

+0

ticketing_information的數據現在只是默認值。不,我不知道任何sql –

回答

-1

您確定要這麼做嗎?

爲什麼表2和3需要與表1相同的信息?我可以看到表2和表3中的表1主鍵的唯一原因是表達一對多或多對多的關係。否則,如果它是一對一關係,則可以考慮將這些列添加到表1中。

表2和表3必須有自己的主鍵。這是第一種正常形式。你應該熟悉那個意思。

+0

表1,表2和表3都是不同類型的事件,完全相互獨立。但是,他們都需要一個「票務信息」實體。因爲可能有不同類型的兩個事件具有相同的ID,所以我選擇使用票務信息ID作爲事件與票務信息之間的鏈接 –

+0

不同的事件應該具有不同的主鍵,但它們可以參考票務信息用外鍵。 – duffymo

+0

我需要這樣做才能編寫遷移,以便將表1中生存的數據推送到表2-5,具體取決於類型。我將數據從單個表格推送到了一個laravel多態關係。在從原始表中刪除列之前,這是遷移數據的關鍵步驟。 –

2

也許你可以使用這個語法:

INSERT INTO "table1" ("column1", "column2", ...) 
SELECT "column3", "column4", ... 
FROM "table2"; 

有了類似的東西:

INSERT INTO ticketing_information1 (column_name) 
SELECT other_column_name 
FROM table1 

它會插入在ticketing_information1表中選擇的每個值的新條目。

0

因此,我在寫一個laravel多態關係的遷移時遇到了這個問題,Franck的答案很接近,但是錯過了更新本地鍵以匹配新行的部分。

我下面弗蘭克的回答原來的移民是

INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`) 
SELECT `title`, `content` 
FROM `blocks` where `type` = "anchor"; 

如果參照原始塊住在anchor_block作爲屬於這個本來是很容易的,我可能只是做

INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `block_id`) 
SELECT `title`, `content`, `id` 
FROM `blocks` where `type` = "anchor"; 

但是這種情況並非如此,因爲多態關係存在於blocks表中,所以我最終得到了以下代碼:

/* Create The New Table */ 
CREATE TABLE `block_anchor_blocks` (
    `id` CHAR(36) PRIMARY KEY, 
    `anchor_slug` VARCHAR(255), 
    `label` VARCHAR(255), 
    `created_at` TIMESTAMP, 
    `updated_at` TIMESTAMP 
); 


/* Build the polymorphic fields on the table we're refactoring */ 
ALTER TABLE `blocks` 
ADD `blockable_id` CHAR(36); 
ALTER TABLE `blocks` 
ADD `blockable_type` VARCHAR(255); 

/* Generate the UUID to use when creating an entry in the new table. */ 
UPDATE `blocks` 
SET `blockable_id`=(SELECT UUID()),`blockable_type`="Acme\\Shared\\Entities\\Blocks\\AnchorBlock" 
WHERE `type` = "anchor"; 

/* Finally we Insert using the ID we generated in the last step */ 
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `id`, `created_at`, `updated_at`) 
SELECT `title`, `content`, `blockable_id`, NOW(), NOW() 
FROM `blocks` where `type` = "anchor"; 

有希望的是,這有助於任何嘗試將大型單個表重構爲多個連接表的人。

相關問題