2016-07-27 63 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

相关问题