2013-03-07 68 views
0

我正在從一組CSV數據導入例程到我的主數據庫中,並且堅持使用這組特定的數據。我使用LOAD DATA LOCAL INFILE到CSV數據轉儲到我的表,feed_hcp_leasenote:在數據導入過程中永不結束MySQL查詢

CREATE TABLE `feed_hcp_leasenote` (
`BLDGID` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`LEASID` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`NOTEDATE` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`REF1` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`REF2` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`LASTDATE` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`USERID` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`NOTETEXT` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL, 
`tempid` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`tempid`), 
KEY `BLDGID` (`BLDGID`), 
KEY `LEASID` (`LEASID`), 
KEY `REF1` (`REF1`), 
KEY `NOTEDATE` (`NOTEDATE`) 
) ENGINE=MyISAM AUTO_INCREMENT=65002 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

我想這個數據導入到兩個表,lease_notes和customfield_data。 lease_notes只存儲唯一的ID值,便條本身以及將其鏈接到租賃表的蓋子。 customfield_data爲系統和用戶創建的字段存儲各種數據,每條記錄通過linkid字段鏈接到另一個表。這裏的lease_note表:

CREATE TABLE `lease_notes` (
`lnid` int(11) NOT NULL AUTO_INCREMENT, 
`notetext` longtext COLLATE utf8_unicode_ci NOT NULL, 
`lid` int(11) NOT NULL COMMENT 'Lease ID', 
PRIMARY KEY (`lnid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

而且customfield_data表:

CREATE TABLE `customfield_data` (
`cfdid` int(11) NOT NULL AUTO_INCREMENT, 
`data_int` int(11) DEFAULT NULL, 
`data_date` datetime DEFAULT NULL, 
`data_smtext` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL, 
`data_lgtext` longtext COLLATE utf8_unicode_ci, 
`data_numeric` decimal(20,2) DEFAULT NULL, 
`linkid` int(11) DEFAULT NULL COMMENT 'ID value of specific item', 
`cfid` int(11) NOT NULL COMMENT 'Custom field ID', 
PRIMARY KEY (`cfdid`), 
KEY `data_smtext` (`data_smtext`(333)), 
KEY `linkid` (`linkid`), 
KEY `cfid` (`cfid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

被卡住的查詢如下:

SELECT NOTEDATE, REF1, REF2, LASTDATE, USERID, feed_hcp_leasenote.NOTETEXT, leases.lid, lease_notes.lnid 
FROM feed_hcp_leasenote 
JOIN customfield_data mrileaseid ON feed_hcp_leasenote.LEASID = mrileaseid.data_smtext AND mrileaseid.cfid = ? 
JOIN leases ON mrileaseid.linkid = leases.lid 
JOIN suites ON leases.sid = suites.sid 
JOIN floors ON suites.fid = floors.fid 
JOIN customfield_data coid ON floors.bid = coid.linkid AND coid.cfid = ? AND coid.data_smtext = feed_hcp_leasenote.BLDGID 
JOIN customfield_data status ON leases.lid = status.linkid AND status.cfid = ? AND status.data_smtext <> ? 
LEFT JOIN lease_notes ON leases.lid = lease_notes.lid 
LEFT JOIN customfield_data notedate ON lease_notes.lnid = notedate.linkid AND notedate.data_date = feed_hcp_leasenote.NOTEDATE AND notedate.cfid = ? 
LEFT JOIN customfield_data ref1 ON lease_notes.lnid = ref1.linkid AND ref1.data_smtext = feed_hcp_leasenote.REF1 AND ref1.cfid = ? 

我與這個目標是返回所有記錄在feed_hcp_leasenote中,根據lease_notes.lnid是否爲null,根據需要插入或更新記錄(空值將被插入,而不是空值將被更新。)問題是,provi代理數據使用4個字段的組合來確定唯一性:BLDGID,LEASID,NOTEDATE和REF1。如果沒有正確的BLDGID和LEASID,筆記就不會存在(在我的查詢中翻譯爲有效的蓋子。它可以將現有記錄與有效蓋子,NOTEDATE和REF1相匹配,但如果這些不匹配,則可以假設這是一個新的記錄

如果我砍掉所有的LEFT JOIN和lease_notes.lnid從SELECT中,它正確執行並給我所有記錄由於我無法讓我的原始查詢工作,我玩了循環所有結果並執行另一個 SELECT的想法,以查看指示符和ref1是否匹配,如果不是,則爲INSERT,否則爲UPDATE。雖然此方法起作用,但每秒只能處理大約20條記錄,米在處理30,000在裂縫。

,因爲我得到問關於它的前一個問題,這裏有一個解釋我的查詢:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE status ref  data_smtext,linkid,cfid  cfid 4 const 934  Using where 
1 SIMPLE mrileaseid ref  data_smtext,linkid,cfid  linkid 5 rl_hpsi.status.linkid 19 Using where 
1 SIMPLE leases eq_ref PRIMARY,sid  PRIMARY  4 rl_hpsi.mrileaseid.linkid 1 Using where 
1 SIMPLE suites eq_ref PRIMARY,fid  PRIMARY  4 rl_hpsi.leases.sid 1  
1 SIMPLE floors eq_ref PRIMARY,bid  PRIMARY  4 rl_hpsi.suites.fid 1  
1 SIMPLE feed_hcp_leasenote ref  BLDGID,LEASID LEASID 153  rl_hpsi.mrileaseid.data_smtext 19 Using where 
1 SIMPLE coid ref  data_smtext,linkid,cfid  data_smtext  1002 rl_hpsi.feed_hcp_leasenote.BLDGID 10 Using where 
1 SIMPLE lease_notes  ALL  NULL NULL NULL NULL 15000  
1 SIMPLE notedate ref  linkid,cfid  linkid 5 rl_hpsi.lease_notes.lnid 24 
1 SIMPLE ref1 ref  data_smtext,linkid,cfid  data_smtext  1002 rl_hpsi.feed_hcp_leasenote.REF1  10 

任何人都可以點我在正確的方向?謝謝!

+0

我可能錯過了一些東西,因爲我並沒有清楚地瞭解所有這些,但'INSERT ON DUPLICATE KEY UPDATE'看起來像你想要遵循的語法,谷歌這句話來了解更多關於它。 – invertedSpear 2013-03-07 21:41:06

+0

好吧,不幸的是我不會有重複的鍵,因爲源數據沒有可用於比較的唯一ID字段。 – 2013-03-07 21:48:17

+0

添加一個。您導入數據並知道使記錄具有唯一性的規則,向表中添加唯一鍵似乎很簡單。 – invertedSpear 2013-03-07 21:55:48

回答

1

從我們的評論:

答案是補充,使獨特的一個條目,以您的目標表中的列,並在其上創建一個複合唯一鍵。然後在插入該表時使用INSERT ON DUPLICATE KEY UPDATE以防止重複的數據。插入完成後,如果不再需要這些列,可以刪除這些列,以防止將數據存儲在多個表中。