2011-09-20 100 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

相關問題