【问题标题】:Confused with table structure对表结构感到困惑
【发布时间】: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


【解决方案1】:

我认为您正在寻找文章和日期的唯一索引/约束:

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的值。

【讨论】:

  • 此时,摆脱id,拥有PRIMARY KEY(article, registration_date)
猜你喜欢
  • 2023-03-26
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
相关资源
最近更新 更多