将数据从表复制到另一个表MySQL

时间:2011-09-20 15:47:32

标签: mysql database

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

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

父表每天早上都由一家独立公司更新,遗憾的是没有时间戳(日期时间)来关联新添加的记录。

谷歌地理编码需要我的子表(副本),因为他们的早晨udpates会丢弃,并且每天早上都会创建父表。

我制作了父表的结构和数据副本,然后删除了最后十条记录来测试我的查询。但我一直收到错误列数与第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

4 个答案:

答案 0 :(得分:5)

如果您只运行SELECT中的INSERT声明,则会看到您的选择会返回 mls_cvrmls和{{1}的所有列}。

您可能需要:

mlscopy

修改

我不确定你的JOIN条件是否正确。这种情况可能会返回许多您不希望的记录。 INSERT INTO mlscopy SELECT parent.* FROM mls_cvrmls AS parent LEFT JOIN mlscopy AS child ON child.listing_listnum != parent.listing_listnum 中的每条记录在mls_cvrmls中都有许多(很多!)记录符合条件。

作为一个例子,让我们假设2个表有3列,你想要从父到子添加所有记录,只要它们不再存在。

mlscopy

答案 1 :(得分:3)

这里有很多事情。

  1. 错误消息是因为“select *”为您提供查询中所有表的所有列。也就是说,每行都有mls_cvrmls中的所有列PLUS来自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。是否要更新现有记录,或者是否要插入新记录?

  4. 因此,假设您要做的是查找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)
    

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

    只是旁注:为什么要在列表名称前加上“listing_”?这样每次使用表时都会输入更多内容。如果你有另一个名称可能相同且需要区分的表,则可以使用表名前缀,例如“mls_cvrmls.propertytype”。

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

答案 3 :(得分:0)

这两个表具有不同的结构,并且您没有指定将要复制的WHICH字段。如果必须具有不同的结构,则必须明确声明应复制WHICH字段。 MySQL不够智能,无法自行解决这种不匹配问题,所以它会抱怨并中止。