【问题标题】:mySQL Update tuple based on foreign key基于外键的 mySQL 更新元组
【发布时间】:2012-09-10 20:06:55
【问题描述】:

想象有 2 张桌子 - Vehicles & Manufacturers。

车辆(Id[PK]、Manufacturer_Id[FK]、名称、价格、折扣)

制造商(Id[PK],名称)

如果我想更新制造商名称为“BMW”的所有车辆。

我的笨方法...

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

一旦我有了制造商 ID,我就可以运行更新查询。

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

我正在寻找一个更优雅的解决方案,我可以在更新语句中以某种方式引用“BMW”,并取消选择查询。

例如我想做这样的事情......如果可能的话:

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

【问题讨论】:

  • 也许像做和update 使用where in: stackoverflow.com/questions/2474879/…
  • 啤酒机 10% 折扣?我在哪里注册?或者那是一分钱的折扣?在哪里从列表中删除我的名字?
  • 哈哈!!!好吧,这只是一个例子......

标签: php mysql sql-update


【解决方案1】:

类似这样的查询应该可以工作:

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

【讨论】:

  • 对不起,伙计,马特 S 比你早 2 分钟到达那里。感谢您的帮助
【解决方案2】:
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN 
(SELECT id FROM Manufacturers WHERE Name = 'BMW');

【讨论】:

    【解决方案3】:

    简单的答案是子选择,但通常子选择不利于性能。在这种情况下假设 OK。如果需要经常使用制造商密钥对(id-name)、填充选择、从显示的名称中获取 id 等。使用 Identity Map 模式(假设类似于 OOP)和另外使用类似 memcache 的东西可能是有意义的为您提供缓存策略,以减少更多访问数据库的次数。

    【讨论】:

    • 这是过度设计,对于任何具有适当索引的平均大小的数据库来说都不是一个好的解决方案。
    • 没有看到提及尺寸。如果 OP 试图阻止多余的“查找”选择,我认为我的回答也是有效的。我个人并不将子选择等同于优雅。
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多