2011-09-20 101 views
2

我在更新新添加的记录时没有将时间戳更新到同一数据库中的另一个相同表中。这里是我的查询将表中的数据复制到另一个表MySQL

INSERT INTO mlscopy 
SELECT * FROM mls_cvrmls AS parent 
LEFT JOIN mlscopy AS child 
ON child.listing_listnum != parent.listing_listnum 

父表是由一个独立的公司,每天早上更新了,可惜没有时间戳(日期时间),以涉及新添加的记录。

我的孩子表(副本)是谷歌地理编码所必需的,因为他们早上的孩子们每天早上都会放弃并创建父表。

我做了父表的结构和数据副本,然后删除了最后十条记录来测试我的查询。但我不断收到错误列计数不匹配第1行的值计数。

不能想到我在这里做错了什么。

下面是列的表名

listing_listing 
listing_listnum 
listing_propertytype 
listing_status 
listing_listingpublicid 
listing_agentname 
listing_agentlist 
listing_listingbrokercode 
listing_officelist 
listing_lo 
listing_lo00 
listing_lo01 
listing_lo02 
listing_lo03 
listing_lo04 
listing_lo05 
listing_agentcolist 
listing_agentcolist00 
listing_officecolist 
listing_area 
listing_listdate 
listing_listprice 
listing_streetnumdisplay 
listing_streetdirectional 
listing_streetname 
listing_streettype 
listing_countyid 
listing_zipcode 
listing_zipplus4 
listing_postoffice 
listing_subdivision 
listing_neighborhood 
listing_schoolelem 
listing_schooljunior 
listing_schoolhigh 
listing_pud 
listing_lotdim 
listing_acres 
listing_zoning 
listing_sqfttotal 
listing_sqftunfinished 
listing_rooms 
listing_bedrooms 
listing_stories 
listing_basement 
listing_garage 
listing_garagecap 
listing_fireplaces 
listing_pool 
listing_bathsfull 
listing_bathshalf 
listing_bathstotal 
listing_bathsfullbsmt 
listing_bathsfulllevel1 
listing_bathsfulllevel2 
listing_bathsfulllevel3 
listing_bathshalfbsmt 
listing_bathshalflevel1 
listing_bathshalflevel2 
listing_bathshalflevel3 
listing_roombed2desc 
listing_roombed2length 
listing_roombed2level 
listing_roombed2width 
listing_roombed3desc 
listing_roombed3length 
listing_roombed3level 
listing_roombed3width 
listing_roombed4desc 
listing_roombed4length 
listing_roombed4level 
listing_roombed4width 
listing_roombed5desc 
listing_roombed5length 
listing_roombed5level 
listing_roombed5width 
listing_roomdiningdesc 
listing_roomdininglength 
listing_roomdininglevel 
listing_roomdiningwidth 
listing_roomfamilydesc 
listing_roomfamilylength 
listing_roomfamilylevel 
listing_roomfamilywidth 
listing_roomfloridadesc 
listing_roomfloridalength 
listing_roomfloridalevel 
listing_roomfloridawidth 
listing_roomfoyerdesc 
listing_roomfoyerlength 
listing_roomfoyerlevel 
listing_roomfoyerwidth 
listing_roomgreatdesc 
listing_roomgreatlength 
listing_roomgreatlevel 
listing_roomgreatwidth 
listing_roomkitchendesc 
listing_roomkitchenlength 
listing_roomkitchenlevel 
listing_roomkitchenwidth 
listing_roomlaundrydesc 
listing_roomlaundrylength 
listing_roomlaundrylevel 
listing_roomlaundrywidth 
listing_roomlivingdesc 
listing_roomlivinglength 
listing_roomlivinglevel 
listing_roomlivingwidth 
listing_roommasterbrdesc 
listing_roommasterbrlength 
listing_roommasterbrlevel 
listing_roommasterbrwidth 
listing_roomofficedesc 
listing_roomofficelength 
listing_roomofficelevel 
listing_roomofficewidth 
listing_roomother1desc 
listing_roomother1length 
listing_roomother1level 
listing_roomother1width 
listing_roomother1 
listing_roomother2desc 
listing_roomother2length 
listing_roomother2level 
listing_roomother2width 
listing_roomother2 
listing_roomrecdesc 
listing_roomreclength 
listing_roomreclevel 
listing_roomrecwidth 
listing_handicap 
listing_yearbuilt 
listing_lotdesc 
listing_construction 
listing_watertype 
listing_roof 
listing_attic 
listing_style 
listing_floors 
listing_fireplacedesc 
listing_structure 
listing_walltype 
listing_basedesc 
listing_appliances 
listing_interior 
listing_exterior 
listing_amenities 
listing_pooldesc 
listing_fence 
listing_porch 
listing_heatsrc 
listing_heatsystem 
listing_coolsystem 
listing_waterheater 
listing_watersewer 
listing_parking 
listing_garagedesc 
listing_handicapdesc 
listing_feedesc 
listing_restrictions 
listing_terms 
listing_assocfeeincludes 
listing_building 
listing_possession 
listing_farmtype 
listing_ownerdesc 
listing_irrigationsrc 
listing_taxyear 
listing_taxamount 
listing_directions 
listing_remarks 
listing_virtualtourlink 
listing_vowavmyn 
listing_vowcommyn 
listing_addressdisplayyn 
listing_f174 
listing_proptype 
listing_lat 
listing_lon 
listing_photo1 
listing_listofficename 
listing_vtoururl 
listing_multiphotoflag 
    id <- primary key 

回答

5

如果你只从运行SELECT声明你的INSERT,你会看到你的选择返回所有的列都mls_cvrmlsmlscopy

你可能需要:

INSERT INTO mlscopy 
SELECT parent.* FROM mls_cvrmls AS parent 
LEFT JOIN mlscopy AS child 
ON child.listing_listnum != parent.listing_listnum 

编辑

我不知道你的连接条件是正确的。这种情况可能会返回你不想要的许多记录。 mls_cvrmls中的每条记录在mlscopy中都有许多(许多!)记录,满足条件。

举一个例子,假设2个表有3列,并且您希望将所有记录从父到子添加,只要它们不再存在那里。

INSERT INTO mlscopy (listing_listing, listing_listnum, listing_propertytype) 
SELECT parent.listing_listing, 
     parent.listing_listnum, 
     parent.listing_propertytype // (more columns...) 
FROM mls_cvrmls AS parent 
LEFT JOIN mlscopy AS child 
    ON child.listing_listnum = parent.listing_listnum 
WHERE child.listing_listnum IS NULL 
+0

添加了表格列名称。从您的查询,我得到未知的表格mls_cvrmls –

+0

@Andre - 修正了 – Galz

+0

@Andre - 两者都做家长和孩子都在同一列(所有的)? – Galz

0

这两个表具有不同的结构,并且您没有指定将复制哪些字段。如果你必须有不同的结构,你必须明确指出应该复制哪些字段。 MySQL不够智能,不能单独处理这种不匹配,所以它会抱怨并中止。

2

习惯于列出所有列,您将为自己节省一些像这样的麻烦,并且在将来您的代码不会因为添加更多列而中断。

改变你的SQL语句像这样

INSERT INTO mlscopy (col1,col2,col3...coln) 
SELECT col1,col2,col3....coln FROM mls_cvrmls AS parent 
LEFT JOIN mlscopy AS child 
ON child.listing_listnum != parent.listing_listnum 
+0

绝对如此。不应使用select *或不指定插入列来写入插入!即使有人重新安排了列顺序(你不应该这样做,但是它会发生,尤其是当人们使用select *而不是指定列时,因为这是他们知道以他们想要的顺序获得列的唯一方法。),初始查询可能会出错。 – HLGEM

3

夫妇的事情在这里。

  1. 错误信息是因为“SELECT *”为您提供了从查询中的所有表中的所有列。也就是说,每行都包含mls_cvrmls中的所有列,并加上mlscopy中的所有列。这不适合插入到mlscopy中,因为它会有许多额外的列。如果这两个表具有所有相同的列,那么它们将全部加倍。

  2. 你的WHERE子句是不太可能是正确的。这就是说,对于父代中的每一行,您都希望子代中的所有行不匹配。考虑一下。假设家长的listing_listnum值为1,2和4,孩子的值为1,4和5.因此,排除对1/1和4/4。但你会得到1/4,1/5,2/4,2/5,4/1和4/5对。我认为你在这里真正想要的只是从父母那里获得根本找不到的记录,就像这个例子中的那样,只有2个。所以你可能真正想要的是一个“不存在”的查询。

  3. 我不是从你的描述完全清楚,但你说你要“更新新添加的记录”,但你做一个INSERT。你想更新现有的记录,还是想插入新的记录?

所以假设你想要做的是发现,在mls_cvrmls记录,但不是在mlscopy并插入这些记录,我认为正确的查询会更喜欢 - 和你的字段列表很长,所以我我会挑选几个样本字段来表示:

insert into mlscopy (listing_listing, listing_listnum, listing_propertytype, listing_status  
    listing_listingpublicid, listing_agentname) 
select listing_listing, listing_listnum, listing_propertytype, listing_status  
    listing_listingpublicid, listing_agentname 
from mls_cvrmls 
where not exists (select 1 from mlscopy where mlscopy.listing_listnum=mls_cvrmls.listing_listnum) 

正如Icarus所说,您应该明确列出所有列。其中有很多原因,即使这两个表都具有相同的字段,如果它们不以相同的顺序出现,“insert into mlscopy select *”将不起作用,因为SQL引擎不匹配名称,它只是按照它们出现的顺序获取每个表中的字段。如果列表很长,这可能看起来很痛苦,但相信我,在你被神秘的问题烧了几次之后,你会想明确地列出这些字段。

而只是一个侧面说明:你为什么前缀的所有与“listing_”列名?这使得每次使用表格时都会输入更多内容。如果另一个表的名称本来是相同的,并且需要区分,则始终可以使用表名作为前缀,如“mls_cvrmls.propertytype”。

+0

+1的辛勤工作和详细的答案 – Galz

相关问题