Mysql 与表格结构混淆

Mysql 与表格结构混淆,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,我正在开发一个库存系统,在这个系统中,我将有关产品的信息保存在MariaDB中。产品存储在表“article”中,每个产品都有一个uniqe ID 我有另一个表“stocks”,它包含关于物品的信息,即金额和插入日期。插入日期很重要,因为同一篇文章可以在数据库中存在两次,但插入日期不同 例如,你在星期一买了两个苹果,并将它们存入数据库。周三,你又买了两个苹果,并将它们放入数据库。 数据库中总共有4个苹果,但分为两行,注册日期不同。这种区别是我的系统的一个重要特性,因为我想知道一个产品在数据库中已

我正在开发一个库存系统,在这个系统中,我将有关产品的信息保存在MariaDB中。产品存储在表“article”中,每个产品都有一个uniqe ID

我有另一个表“stocks”,它包含关于物品的信息,即金额和插入日期。插入日期很重要,因为同一篇文章可以在数据库中存在两次,但插入日期不同

例如,你在星期一买了两个苹果,并将它们存入数据库。周三,你又买了两个苹果,并将它们放入数据库。 数据库中总共有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使同一篇文章有可能在同一个注册日期出现两次,这是我不想要的

例如,尽管注册日期是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字段,但出于方便起见,我需要它,所以我想知道是否有更好的方法

我曾想过在程序内部解决这个问题(检查文章是否存在库存,检查日期等),但这对我来说似乎不公平


我觉得一定有一个简单明了的解决办法,但我看不出来。感谢您的帮助。

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

alter table stocks add constraint unq_stocks_article_date unique (article, registration_date);
然后所需的
更新将如下所示:

INSERT INTO stocks (article_id, amount, registration_date)
    VALUES (1, 3, CURDATE())
    ON DUPLICATE KEY UPDATE amount = amount + values(amount);

增量基于传递到
插入

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

alter table stocks add constraint unq_stocks_article_date unique (article, registration_date);
然后所需的
更新将如下所示:

INSERT INTO stocks (article_id, amount, registration_date)
    VALUES (1, 3, CURDATE())
    ON DUPLICATE KEY UPDATE amount = amount + values(amount);

增量基于在insert的复制密钥更新版本上传递到
insert

读取的值。在insert的复制密钥更新版本上读取的值可能重复。在该点上,可能重复,请删除
id
并拥有
主键(文章、注册日期)
。此时,去掉
id
并拥有
主键(文章、注册日期)