将表中的数据复制到另一个表MySQL
我在更新新添加的记录时没有将时间戳更新到同一数据库中的另一个相同表中。这里是我的查询将表中的数据复制到另一个表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
如果你只从运行SELECT
声明你的INSERT
,你会看到你的选择返回所有的列都mls_cvrmls
和mlscopy
。
你可能需要:
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
这两个表具有不同的结构,并且您没有指定将复制哪些字段。如果你必须有不同的结构,你必须明确指出应该复制哪些字段。 MySQL不够智能,不能单独处理这种不匹配,所以它会抱怨并中止。
习惯于列出所有列,您将为自己节省一些像这样的麻烦,并且在将来您的代码不会因为添加更多列而中断。
改变你的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 *而不是指定列时,因为这是他们知道以他们想要的顺序获得列的唯一方法。),初始查询可能会出错。 – HLGEM
夫妇的事情在这里。
错误信息是因为“SELECT *”为您提供了从查询中的所有表中的所有列。也就是说,每行都包含mls_cvrmls中的所有列,并加上mlscopy中的所有列。这不适合插入到mlscopy中,因为它会有许多额外的列。如果这两个表具有所有相同的列,那么它们将全部加倍。
你的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个。所以你可能真正想要的是一个“不存在”的查询。
我不是从你的描述完全清楚,但你说你要“更新新添加的记录”,但你做一个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”。
+1的辛勤工作和详细的答案 – Galz
添加了表格列名称。从您的查询,我得到未知的表格mls_cvrmls –
@Andre - 修正了 – Galz
@Andre - 两者都做家长和孩子都在同一列(所有的)? – Galz