Php 基于外键的mySQL更新元组
想象一下有两张表-车辆和制造商 车辆(Id[PK],制造商Id[FK],名称,价格,折扣) 制造商(Id[PK],名称) 如果我想更新制造商名称为“BMW”的所有车辆 我笨拙的方式Php 基于外键的mySQL更新元组,php,mysql,sql-update,Php,Mysql,Sql Update,想象一下有两张表-车辆和制造商 车辆(Id[PK],制造商Id[FK],名称,价格,折扣) 制造商(Id[PK],名称) 如果我想更新制造商名称为“BMW”的所有车辆 我笨拙的方式 "SELECT Id FROM Manufacturers WHERE Name = 'BMW'"; 获得制造商Id后,我可以运行更新查询 UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id='$manuId' 我所寻找的是一个更优雅的解决方案,通过它
"SELECT Id FROM Manufacturers WHERE Name = 'BMW'";
获得制造商Id后,我可以运行更新查询
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id='$manuId'
我所寻找的是一个更优雅的解决方案,通过它,我可以在update语句中引用“BMW”,并取消select查询
e、 我想做这样的事情。。。如有可能:
UPDATE Vehicles SET Discount='0.1' WHERE Vehicles.Manufacturer_Id = Manufacturer.Id AND Manufacturer.Name = 'BMW'
类似这样的查询应该可以工作:
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN (SELECT Id FROM Manufacturers WHERE Name = 'BMW'")
类似这样的查询应该可以工作:
UPDATE Vehicles SET Discount='0.1' WHERE Manufacturer_Id IN (SELECT Id FROM Manufacturers WHERE Name = 'BMW'")
简单的答案是子选择,但一般来说,子选择不利于性能。假设在这种情况下是OK。如果需要经常使用制造商密钥对(id名称)、填充选择、从显示的名称中获取id等。使用标识映射模式(假设某种OOP外观)可能是有意义的此外,还可以使用memcache for you缓存策略来减少访问数据库的次数。简单的答案是子选择,但通常子选择对性能没有好处。假设在这种情况下是OK。如果需要经常使用制造商密钥对(id名称)、填充选择、从显示的名称中获取id等。使用标识映射模式(假设某种OOP外观)可能是有意义的此外,还可以使用memcache之类的缓存策略来减少更多访问数据库的次数。也许可以使用
where in
:比默斯10%的折扣?我在哪里注册?还是1便士的折扣?我在哪里可以从列表中删除我的名字?哈哈!!!好吧,这只是一个例子……也许像使用where in
:比默斯10%的折扣?我在哪里注册?还是1便士的折扣?我在哪里可以从列表中删除我的名字?哈哈!!!这只是一个例子……这是过度工程化的,对于任何具有适当索引的平均大小的数据库来说都不是一个好的解决方案。没有提到大小。如果OP试图阻止多余的“查找”选择,我认为我的答案也是正确的。我个人并不把子选择等同于优雅。这是过度工程化的,对于任何具有适当索引的平均大小数据库来说都不是一个好的解决方案。没有提到大小。如果OP试图阻止多余的“查找”选择,我认为我的答案也是正确的。我个人并不把替补选秀等同于优雅。对不起,伙计,马特比你早两分钟就到了。谢谢你的帮助。对不起,伙计,马特比你早两分钟到了。谢谢你的帮助