2012-09-10 50 views
0

想象一下有2個表 - 車輛&製造商。mySQL基於外鍵的更新元組

車輛(ID [PK],MANUFACTURER_ID [FK],名稱,價格,折扣)

製造商(ID [PK],名稱)

如果我要更新所有的車輛,其製造商名稱是'寶馬'。

我笨拙的方法...

"SELECT Id FROM Manufacturers WHERE Name = 'BMW'"; 

一旦我有製造商ID,我可以運行更新查詢。

UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id='$manuId' 

我所尋找的是一個更優雅的解決方案,因此我能以某種方式更新語句中引用「寶馬」,並脫離了選擇查詢。

例如我想要做這樣的事情......如果可能的話:

UPDATE Vehicles SET Discount='0.1' WHERE Vehicles.Manufacturer_Id = Manufacturer.Id AND Manufacturer.Name = 'BMW' 
+0

也許像做和'更新'使用'在哪裏':http://stackoverflow.com/questions/2474879/mysql-update-where-in-for-e-ach-listed-value-separately – binnyb

+0

10%折扣beemers?我在哪裏註冊?或者是1便士的折扣?我從哪裏刪除名單? –

+0

大聲笑!那麼這只是一個例子... – Gravy

回答

1
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN 
(SELECT id FROM Manufacturers WHERE Name = 'BMW'); 
+0

謝謝。很有幫助!!! – Gravy

2

像這樣的查詢應該工作:

UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN (SELECT Id FROM Manufacturers WHERE Name = 'BMW'") 
+0

對不起隊友,馬特S在你之前2分鐘就到了那裏。感謝您的幫助,雖然 – Gravy

0

簡單的答案是子選擇,但一般分選擇對於性能不好。假設在這種情況下。如果需要頻繁使用製造商密鑰對(id-name),填充選擇項,在顯示時從名稱中獲取id等等。使用Identity Map模式(假設OOP有些相似)以及另外使用類似memcache的東西因爲你緩存策略在訪問數據庫時會減少更多。

+0

這是過度工程,並不適合任何具有適當索引的平均大小的數據庫。 –

+0

沒有看到提及的大小。如果OP試圖防止多餘的「查找」選擇,我認爲我的答案也是有效的。我個人並不認爲子選擇與優雅。 – ficuscr