2016-07-27 65 views
2

我有一張桌子裏充滿了「商家」中的數據,還有一張名爲「桌子9」的新桌子通過導入進來。我試圖將表9數據遷移到企業,但我需要確保它不存在。我別無選擇,只能運行這個生活(我有備份)在導入mysql之前檢查數據

這是我到目前爲止的代碼:

INSERT INTO businesses 

(Business, Address1,Address2,Address3,Town,Postcode,BusinessType,Contact,Position,Telephone) 

SELECT Company, 

line1, 

line2, 

line3, 

town, 

postcode, 

trade, 

(SELECT CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`) FROM telesales.`table 9`), 

ContactPosition, 

phoneno pnum 

FROM telesales.`table 9` ts 

where pnum NOT IN (SELECT DISTINCT Telephone 

         FROM businesses 

         WHERE Telephone = pnum) 

首先這是怎麼回事做什麼,我期待?只有在表9中的電話號碼不存在於企業表中時纔會插入,並且有沒有辦法說出它是否存在,然後使用新數據更新它?

回答

1

首先,

(SELECT CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`) FROM telesales.`table 9`), 

幾乎可以肯定不是你想要的。你在說「從表9中獲得所有這些信息,並將其放入企業中」,而沒有加入或where子句。不確定MySQL如何對此做出反應,但最好的情況是你得到一個隨機行,而不是與你插入的行相關的行。我想你想用它來代替它:

CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`), 

其次,這個查詢高度依賴於電話號碼的格式。這可能不是一個好主意,除非你能保證格式一致。

例如「00 31 20 787 9000」與「00 31 207 87 9000」的電話號碼相同嗎?

在這種情況下,我通常在table9(例如「businessID」)上創建附加列,然後編寫查詢來填充該列。

例如:

update table9 t9 
inner join businesses b 
    on b.phone = t9.phone 
set businessID = b.businessID 

感檢查表;你會發現,你需要做的

update table9 t9 
inner join businesses b 
    on b.phone = trim(t9.phone) 
set businessID = b.businessID 

最後,你可以從表9插入記錄到有一個空businessID企業,並更新等。

+0

我有一個清理查詢,我用它來確保所有的電話號碼都是相同的格式,我知道它並不完美,但他們都在相同的格式,所以我能夠使用它。感謝您指出選擇concat,我錯過了。 –

1

REPLACE的工作,但..

更換作品酷似INSERT,但如果舊的行在 表中與PRIMARY KEY或UNIQUE索引的新行具有相同的值,舊行在插入新行之前被刪除。

但這意味着數據庫將花費更多的時間和精力來更新索引。更好的辦法是使用INSERT忽略或INSERT .. ON DUPLICATE KEY