2016-12-16 101 views
0

更新:問題是表1有很多表2沒有的行,這就是爲什麼查詢在第一次運行時更新了多個行,但是再次運行查詢時,它只更新了一個行。我不知道爲什麼它更新了未包含在JOIN查詢中的行。帶JOIN的MySQL更新 - 爲什麼只用一個值更新每個字段?

我需要更新表1兩個領域,從兩個字段的數據在表2中

我嘗試這樣做:

UPDATE heroku_chemical_healtheffect h, 
chebi2_compounds c 
SET h.chebi_id = c.chebi_accession, h.chebi_name = c.name 
WHERE h.name = c.name 

但它返回:1 rows affected. (Query took 0.1351 seconds.)

它插入相同的值(表2中第一行的值)分配到表1的每一行中: Rows updated

I特里d使用完整語法:

UPDATE heroku_chemical_healtheffect AS h 
INNER JOIN chebi2_compounds AS c 
ON h.name = c.name 
SET h.chebi_id = c.chebi_accession, h.chebi_name = c.name 

但發生同樣的事情。我是否以錯誤的方式或其他方式將查詢放在一起?

繼承人table 2

enter image description here

當我運行SELECT與JOIN查詢:

SELECT * FROM heroku_chemical_healtheffect AS h 
JOIN chebi2_compounds AS c 
ON h.name = c.name 

enter image description here

我認爲也許是使用索引的問題,所以我刪除來自h.chebi_idh.chebi_name的索引並將索引放在h.namec.name但它沒有改變任何東西。

奇怪的是,它沒有覆蓋已經存在的一些值。一些h.chebi_id字段中有不同的值,並且它們保持不變。它只有它更新的空白字段。並且當它將相同的值插入到具有空白h.name字段的每一行中時,它將返回1 row(s) affected。儘管它更新了幾百行。

繼承人我的意思: enter image description here 它沒有更新,裏面有數據,即使數據是什麼它所有的空行與更新不同的行。

+1

告訴我們也在其他表 –

+0

更新:新增表2至原來的職位。 –

+0

它只更新了一行,因爲這是它可以找到的所有匹配行對。刪除'SET'子句,將'UPDATE'替換爲'SELECT * FROM'來查看匹配的行。 – axiac

回答

0

試試這個:

UPDATE 
    heroku_chemical_healtheffect 
SET 
    heroku_chemical_healtheffect.chebi_id = chebi2_compounds.chebi_accession, 
    heroku_chemical_healtheffect.chebi_name = chebi2_compounds.name 

FROM 
    heroku_chemical_healtheffect 
    INNER JOIN chebi2_compounds 
    ON heroku_chemical_healtheffect.name = chebi2_compounds.name 
+0

它給了我這個錯誤:'#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本對應的手冊,以找到正確的語法,在'FROM heroku_chemical_healtheffect AS h INNER JOIN chebi2_compounds AS'at line 7' –

+0

@SelfDecodeSupport我編輯了我的答案 –

+1

@nimourpristou沒有'FROM' ['UPDATE'語法](http://dev.mysql.com/doc/refman/5.7/en/update.html)。這個表格出現在「SET」子句之前。 – axiac