2011-10-16 35 views
0

我有兩個表自動更新,如果鍵存在

PARTSUPP - table 

PS_PARTKEY 
PS_SUPPKEY 
PS_AVAILQTY 
PS_SUPPLYCOST 
PS_COMMENT 
S_NAME 

SUPPLIER - table 

S_SUPPKEY 
S_NAME 
S_ADDRESS 
S_NATIONKEY 
S_PHONE 
S_ACCTBAL 
S_COMMENT 

那麼我需要:

1 - 迭代更新PARTSUPP.S_NAME與SUPPLIER.S_NAME其中PARTSUPP。 PS_SUPPKEY = SUPPLIER.S_SUPPKEY

回答

1

這是不尋常的,你需要做這樣的事情,可能是一個表明您的數據庫設計存在缺陷。出於性能方面的原因,您是否實際上有意使您的模型非規範化(並在其他表中緩存SUPPLIER.S_NAME)?如果不是,請考慮更改設計(即刪除多餘的PARTSUPP.S_NAME並在運行時使用JOIN)。

話雖這麼說,你可以做你問這樣的更新:我覺得

UPDATE PARTSUPP 
SET S_NAME = (
    SELECT S_NAME 
    FROM SUPPLIER 
    WHERE PARTSUPP.PS_SUPPKEY = SUPPLIER.S_SUPPKEY 
) 
+0

是@ branko-dimitrijevic是出於性能原因。現在即時將關係數據庫遷移到monodb,並且沒有使關聯數據庫非規範化,它花了很多時間。非規範化表需要僅搜索一個表,而不是獲得更快的結果。 – ulima69

+0

@ ulima69那麼我可以建議做這個更新,並確實實施觸發器的平等嗎?另外,你可以考慮規範化的設計,但是使用自然鍵和InnoDB,它們將對行進行物理排序,使得合併連接非常高效(或者至少這是我期望從等效的Oracle技術中獲得的,我並不是那種經驗豐富的MySQL的)。 –

1

你想要的是UPDATE PARTSUPP p SET S_NAME=(SELECT S_NAME FORM SUPPLIER s WHERE s.S_SUPPKEY=p.PS_SUPPKEY)

還是你前人的精力(如果posseble)刪除partsuppp.s_name科拉姆和cvhang的querys需要它SELECT * FROM PARTSUPP LEFT JOIN SUPPLIER ON PS_SUPPKEY=S_SUPPKEY ,那麼你並不需要更新(也蘆葦更多databace設計)

1

也可以做機智h加入而不是內部查詢:

UPDATE FROM PARTSUPP ps 
INNER JOIN SUPPLIER s ON s.S_SUPPKEY = ps.PS_SUPPKEY 
SET ps.S_NAME = s.S_NAME 
WHERE ps.S_NAME <> s.S_NAME