我正在使用库存系统,在那里我保存有关MariaDB中产品的信息。产品存储在表格中,每个产品都有唯一的ID。
我有另一张表' stock&#39 ;,它包含有关文章的信息,即金额和插入日期。插入日期很重要,因为应该可以在数据库中使用相同的文章两次但插入日期不同。
例如,您在周一购买两个苹果并将它们放入数据库中。星期三,你再次购买两个苹果,并将它们放入数据库中。 总的来说,数据库中有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字段,但为了方便起见我需要它,所以我想知道是否有更好的方法。
我想在程序中解决这个问题(检查文章中是否存在文章,查看日期等),但这对我来说似乎不太优雅。
我觉得必须有一个明显而简单的解决方案,但我无法看到它。任何帮助表示赞赏。
答案 0 :(得分:2)
我认为您正在寻找文章和日期的唯一索引/约束:
alter table stocks add constraint unq_stocks_article_date unique (article, registration_date);
您想要的update
看起来像:
INSERT INTO stocks (article_id, amount, registration_date)
VALUES (1, 3, CURDATE())
ON DUPLICATE KEY UPDATE amount = amount + values(amount);
增量基于传递到insert
的值。