在导入mysql之前检查数据

时间:2016-07-27 09:18:00

标签: mysql sql

我在“business”中有一个充满数据的表,以及一个名为“table 9”的新表,它通过导入进入。我正在尝试将表9数据迁移到企业中,但我需要确保它尚不存在。我别无选择,只能现场直播(我有备份)

到目前为止,这是我的代码:

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中的电话号码在商家表中不存在时才插入,并且有没有办法说明它是否存在然后用新数据更新它?

3 个答案:

答案 0 :(得分:1)

如果“if it exists”表示它具有相同的主键,那么是的,您应该使用REPLACE而不是INSERT。见http://dev.mysql.com/doc/refman/5.5/en/replace.html

但是,您应该首先创建目标表的副本; o)

答案 1 :(得分:1)

REPLACE确实有效,但是......

  

REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中   table与PRIMARY KEY或UNIQUE的新行具有相同的值   index,在插入新行之前删除旧行。

但这意味着数据库将花费大量时间和精力来更新索引。更好的方法是使用INSERT IGNORE或INSERT .. ON DUPLICATE KEY

答案 2 :(得分: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

最后,您可以将table9中的记录插入到具有null businessID的业务中,并更新其他业务ID。