繁体   English   中英

导入mysql之前检查数据

[英]Checking data before importing mysql

我有一个充满“业务”中数据的表,还有一个通过导入引入的名为“表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中的电话号码在业务表中不存在时才插入,是否有办法说出该电话号码是否存在,然后用新数据进行更新?

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

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

更换确实可以,但是..

REPLACE的工作方式与INSERT完全相同,不同之处在于,如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前会删除该旧行。

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

首先,

(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中的记录插入到具有空businessID的业务中,并更新其他记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM