SQL..更新产品价格,但保留以前的值


SQL...updating product prices but keeping previous values

我有一个包含价格、名称、日期和ID (PK)的产品表

我需要更新记录时,有一个价格变化(Web抓取脚本),我将如何做到这一点,使一个新的行不插入,而价格和日期更新.....但是之前的值需要保留在DB....中所以当我当我输入

"SELECT * FROM items WHERE id ='27'";

输出想要的:

$400  12.4.2013
$314  22.4.2013
$250  12.4.2013

产品将显示自下载第一个价格以来的所有更新值,实际上它将是该产品的价格历史记录…

我想要达到的实际结果应该是

"产品27"的历史记录为:

给更多的上下文,当我运行我的脚本... ./script.php update .php所有新数据都应该插入或更新....但旧的价值观依然存在我不太确定我应该如何处理这个....请给我一些指导或帮助

在保持数据库整洁,数据易于维护和可读的同时,最好的方法是采用@KishorSubedi在评论中所说的并创建一个日志表。

当您在产品表中更新价格时,将旧价格连同其日期和ID存储在日志表中,然后当您需要查找该产品的所有记录时,您可以在查询中加入日志表。

Log Table
| ProductID | Price | Date      |
| 27        | $300  | 02.1.2013 |
| 27        | $400  | 03.1.2013 |

这样,您就可以拥有一个美观整洁的Products表,它不会被相同产品的多个产品弄得乱七八糟,并且可以轻松访问一个不引人注目的日志表。

如果您想保留旧值,我建议将它们保存在单独的表中,并使用INSERT语句。您总是在添加新行,因此您不能绕过insertselect into或类似的语句。

表结构:

Items
------------------------------
Id          primarykey
Name
Price
------------------------------
Id          primarykey autoincrement
ItemId      index
AddDate     index
Price

现在,当您抓取web时,您只需在Price表中插入新的价格。如果要选择某项商品的所有价格,可以使用

SELECT  Items.Id
       ,Items.Name
       ,Price.Price
       ,Price.AddDate
FROM Items
LEFT JOIN Price
ON Items.Id=Price.ItemId
WHERE Items.Id='27'
ORDER BY Items.Name ASC, Price.AddDate ASC

如果你只想要最新的或当前的价格,你可以使用

SELECT  Items.Id
       ,Items.Name
       ,P1.Price
       ,P1.AddDate
FROM Items
LEFT JOIN Price P1
ON Items.Id=Price.ItemId
LEFT JOIN Price P2
ON P1.ItemId=P2.ItemId
AND P1.Id<P2.Id
WHERE Items.Id='27'
AND P2.Id IS NULL

在'item'表中为历史记录添加新列,每次价格变化都以特定格式将更改后的值附加到该列中,如date1:price1,date2:price2,....