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