【问题标题】:Copy data from table to another table MySQL将数据从表复制到另一个表 MySQL
【发布时间】:2011-11-21 05:25:26
【问题描述】:

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

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

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

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

我制作了父表的结构和数据副本,然后删除了最后十条记录以测试我的查询。但我不断收到错误 Column count doesn't match value count at row 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

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    如果您只从 INSERT 运行 SELECT 语句,您将看到您的选择返回 both mls_cvrmls AND mlscopy 的所有列。

    你可能需要:

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

    编辑

    我不确定您的 JOIN 条件是否正确。这种情况可能会返回许多您不希望的记录。 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
    

    【讨论】:

    • 添加了表格列名。从您的查询中,我得到未知表 mls_cvrmls
    • @Andre - 父母和孩子是否有相同的列(全部)?
    • @Andre :) 这样的 cmets 值得付出努力!
    • 是的,它们都有相同的列
    【解决方案2】:

    这里有几件事。

    1. 错误消息是因为“选择 *”为您提供了查询中所有表的所有列。也就是说,每一行都有来自 mls_cvrmls 的所有列加上来自 mlscopy 的所有列。这不适合插入到 mlscopy 中,因为它将有许多额外的列。如果两个表的列都相同,那么它们都将加倍。

    2. 您的 WHERE 子句不太可能是正确的。这就是说,对于父项中的每一行,您都希望子项中所有不匹配的行。想清楚这一点。假设 parent 的 listing_listnum 值为 1、2 和 4,而 child 的值为 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”。

    【讨论】:

      【解决方案3】:

      习惯于列出所有列,这样您就可以省去一些麻烦,而且将来如果添加更多列,您的代码也不会中断。

      把你的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
      

      【讨论】:

      • 当然。不应使用 select * 或未指定插入列来编写插入!哎呀,即使有人重新排列了列顺序(你不应该这样做,但尤其是当人们使用 select * 而不是指定列时会发生这种情况,因为这是他们知道按他们想要的顺序获取列的唯一方法。),初始查询可能会出错。
      【解决方案4】:

      这两个表具有不同的结构,并且您没有指定将复制哪些字段。如果您必须具有不同的结构,则必须明确说明应复制哪些字段。 MySQL 不够聪明,无法自行解决这种不匹配问题,因此它会报错并中止。

      【讨论】:

        猜你喜欢
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 2012-08-12
        • 2011-04-25
        相关资源
        最近更新 更多