【发布时间】:2017-10-31 15:15:58
【问题描述】:
我正在开发一个库存系统,我在 MariaDB 中保存有关产品的信息。产品存储在“文章”表中,每个产品都有一个唯一的 ID。
我有另一个表“股票”,其中包含有关文章的信息,即数量和插入日期。插入日期很重要,因为应该有可能在数据库中有两次相同的文章,但插入日期不同。
例如,您在星期一购买了两个苹果并将它们放入数据库中。星期三,你又买了两个苹果,也把它们放进了数据库。 总共,您在数据库中有 4 个苹果,但在两个单独的行中并且具有不同的注册日期。这种区别对我的系统来说是一个重要的特性,因为我希望能够知道一个产品在数据库中存放了多少天。
我的表格如下所示:
文章
+------------+--------------+----------+
| article_id | article_name | category |
+------------+--------------+----------+
| 1 | Shiny Apple | Fruit |
+------------+--------------+----------+
股票
+----------+------------+--------+-------------------+
| stock_id | article_id | amount | registration_date |
+----------+------------+--------+-------------------+
| 1 | 1 | 2 | 2017-10-23 |
| 2 | 1 | 2 | 2017-10-25 |
+----------+------------+--------+-------------------+
现在我的问题是,自动递增的 stock_id 使得同一篇文章具有相同的registration_date两次成为可能,这是我不想要的。
例如,尽管注册日期是 PK 的一部分,但我可以多次执行以下查询并获取具有相同日期的多行
INSERT INTO `stocks` (`article_id`, `amount`, `registration_date`)
VALUES (1, 3, CURDATE())
ON DUPLICATE KEY UPDATE amount = amount + 1
预期的行为是,如果您在同一天多次插入一篇文章,“金额”字段应该只是增加而不是插入新行。
如果 stock_id 不是主键的一部分,这是可能的,但是它不会自动递增,因为 MySQL/MariaDB 不允许自动递增字段不作为 PK 的一部分。
另一种选择是完全删除 stock_id 字段,但为了方便起见,我有点需要它,所以我想知道是否有更好的方法。
我曾想过在程序中解决这个问题(检查文章是否存在于库存中,检查日期等),但这对我来说似乎并不优雅。
我觉得必须有一个明显且简单的解决方案,但我看不到它。任何帮助表示赞赏。
【问题讨论】:
-
阅读插入的重复密钥更新版本。
标签: mysql sql database mariadb