2011-03-22 49 views
2

我有點生疏與MySQL,並試圖再次跳入..所以對不起,如果這太容易的問題。將數據添加到相關的表..更方便嗎?

我基本上創建了一個有一個被稱爲「大師」的名稱和一個IDCODE和再出「細節」 IDCODE的外鍵表的必填字段表的數據模型。

現在,這裏的地方得到它我tricky..I進入:

INSERT INTO Details (Name, UpdateDate) Values (name, updateDate) 

我得到一個錯誤:話說細節IDCODE沒有默認value..so我加一則抱怨說,現場「Master_IDcode」沒有默認值

這一切都有道理,但我不知道是否有任何簡單的方法做我想做的事情。我想添加數據到細節,如果沒有IDcode存在,我想添加一個條目到主表中。問題是我必須先將名稱添加到基金Master..wait中,以生成唯一的ID(對於IDcode),然後在輸入主數據時將其解釋並添加到我的查詢中。正如你可以想象的那樣,由於我有很多表格,查詢可能會很長。

有沒有更簡單的方法?每當我添加一些按名稱搜索的內容時,如果外鍵存在,如果不存在,它會將其添加到鏈接的所有表上?人們有這樣的標準方式嗎?我無法想象所有複雜的數據庫在那裏人們還沒有找到更簡單的方法。

很抱歉,如果這個問題沒有意義。如果需要,我可以添加更多信息。

p.s.這可能是一個不同的問題,但我聽說過python的Django,它有助於創建查詢......它會幫助我的情況嗎?

在此先感謝:-)

+0

如果主記錄不存在,你爲什麼要插入子記錄?我很難想象這種情況何時出現在GUI中。喜歡,加一個朋友,突然發現你自己不存在?將產品添加到類別並發現您從下拉列表中選擇的類別不存在?增加一名員工到你的公司,你發現你忘了找到一家公司? – Ronnis 2011-03-22 21:36:22

+0

嗨Ronnis,這不是用在一個GUI ..實際上我填充一個數據庫。我得到一個公司的詳細清單,並將其導入幾張不同的表格。爲了把所有東西都放在一起,我決定創建一個只有名稱和ID代碼的主表(這是大多數其他表的外鍵)。所以在這張表中,當我意識到一個主記錄不存在時,我將在細節表中添加一條記錄,我希望它能創建一條記錄。我想我需要在主數據庫中搜索一個ID,如果沒有,那麼生成它,然後根據添加的詳細信息行。 – Lostsoul 2011-03-22 23:00:12

+0

如果您有文件中的數據,則可以先將數據加載到中間表中(使用加載數據infile)。然後在表格上傳一遍,然後「插入到不存在的主表中」。然後您知道所有masterID都存在,並且您可以繼續執行「insert into detailX select ... from that_temp_table」。 – Ronnis 2011-03-22 23:08:20

回答

1

(決定擴大對上述意見,並把它變成一個答案)

我建議在你的數據庫(每個數據集/文件)創建一組臨時表的。

然後使用LOAD DATA INFILE(或插入在批次中的行)到這些臨時表。 確保在加載之前刪除索引,並在數據加載後重新創建所需的內容。

然後,您可以做一個單一的傳過來的臨時表來創建缺少的主記錄。例如,假設您的一個臨時表包含應該用作masterID的國家/地區代碼。您可以通過沿線的做一些補充的主記錄:

insert 
    into master_table(country_code) 
select distinct s.country_code 
    from staging_table  s 
    left join master_table m on(s.country_code = m.country_code) 
where m.country_code is null; 

然後你就可以繼續並插入行到「真正的」表,知道所有的細節行引用了有效的主記錄。

如果您需要獲取參考信息以及數據(例如翻譯一些代碼),您可以通過簡單的連接完成此操作。另外,如果你想通過其他表格過濾行,這現在也很容易。

insert 
    into real_table_x(
      key 
     ,colA 
     ,colB 
     ,colC 
     ,computed_column_not_present_in_staging_table 
     ,understandableCode 
     ) 
    select x.key 
     ,x.colA 
     ,x.colB 
     ,x.colC 
     ,(x.colA + x.colB)/x.colC 
     ,c.understandableCode 
    from staging_table_x x 
    join code_translation c on(x.strange_code = c.strange_code); 

這種方法是一個非常有效的方法,它的尺度非常好。上述變體通常用於數據倉庫的ETL部分來加載大量數據。

與MySQL的一個警告是,它不支持散列連接,這是一個非常適合完全連接兩個表的連接機制。 MySQL使用嵌套循環代替,這意味着您需要需要非常仔細地索引連接列。 具有主鍵上的集羣功能的InnoDB表可以幫助提高效率。

最後一點。當數據庫中有臨時數據時,可以很容易地添加一些數據分析,並將「壞」行放在單獨的表中。然後,您可以使用SQL檢查數據,而不是通過yuor編輯器中的csv文件涉水。

+0

非常感謝Ronnis,你解釋得很好,我想我現在明白了。再次感謝..祝您有美好的一天! – Lostsoul 2011-03-26 02:39:20

1

我不認爲有一步到位的方式來做到這一點這麼多。

我要做的就是問題上

INSERT IGNORE (..) values (..) 

主表,至極將要麼創建行,如果它不存在,或者什麼都不做,然後發出

SELECT id FROM master where someUniqueAttribute = .. 

另一個選項是存儲過程/觸發器,但它們在MySQL中仍然很新,我懷疑這會有助於提高性能。