【问题标题】:On duplicate key based on two columns基于两列的重复键
【发布时间】:2014-02-06 03:23:25
【问题描述】:

我的 java 应用程序有点麻烦,要么我知道的不够多,要么这不可能以简单的方式。我希望这是第一个选择,因为我是初学者。

这是我的桌子:

CREATE TABLE IF NOT EXISTS `evolution` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `product` varchar(50) NOT NULL,
 `quantity` double NOT NULL,
 `date` date NOT NULL,
 `operator` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
) 

我想按日期跟踪某些产品的销售情况。

我想要实现的是:假设操作员今天输入17.01.2014 产品banana,数量为4。那天晚些时候,他将插入apples,数量为10 .同一天他将插入数量为1banana和数量为12apples

明天他也会这样做,插入bananas,数量为2,但日期为18.01.2014。这应该是新的一行,因为它是同一产品,但日期不同。

在这种情况下,我需要我的数据库执行以下操作: 检查banana是否插入17.01.2014。如果没有,插入数量0+4。 如果香蕉已经插入17.01.2014,则更新数量4+1

第二天它会检查banana是否被插入到18.01.2014。如果没有,插入数量2。如果是,更新数量。

所以:我不能有任何唯一的列,因为applesbanana 的日期可以相同,日期和数量也可以相同。

我怎样才能做到这一点? 我想了几种方法,但效率不高:

  1. Select (product,date) from evolution where product=banana AND date=18.01.2014 如果这返回任何内容,那么我将执行更新。 如果这没有返回任何内容,那么我将执行插入。

  2. 创建一个唯一的列product-date。我将在其中插入例如banana 17.01.2014。这会更容易,但我不喜欢这种方式,它很脏。

如果我可以在重复键上执行双重操作,这一切都会变得如此简单。尝试插入 banana and date。然后,如果组合已经存在,请进行更新。

为了让它更短更容易理解:

这是有效的:

+-------+----------+
|product|date      |
+-------+----------+
|banana |17.01.2014|
+-------+----------+
|banana |18.01.2014|
+-------+----------+
|apples |17.01.2014|
+-------+----------+
|apples |18.01.2014|
+-------+----------+

这是无效的:

+-------+----------+
|product|date      |
+-------+----------+
|banana |17.01.2014|
+-------+----------+
|banana |17.01 2014|
+-------+----------+
|banana |18.01.2014|
+-------+----------+
|banana |18.01.2014|
+-------+----------+

所以他们(productdate)可以自己重复但不能在一起。

很抱歉这篇长文...我希望我不会错过任何简单而干净的方法,但我可能会而且我当然希望如此,我是编程的初学者。 谢谢,晚安!

【问题讨论】:

  • 在(产品、日期)上有一个唯一的密钥!?!?!
  • 似乎您正在追求产品和日期的独特限制。可以在事后添加它或使其成为 create table 语句的一部分。之后执行此操作将如下所示:ALTER TABLE evolution ADD CONSTRAINT uc_product UNIQUE (product,date)

标签: java mysql sql


【解决方案1】:

听起来您想要产品和日期的复合键。

PRIMARY KEY (product, date)

复合主键本质上是一种使用多个键来确定事物唯一性的方法。例如,如果您的商店只出售蓝色或红色的锤子和钉子,您无法将数据库中的锤子和钉子识别为锤子或蓝色,您必须同时使用两者

tool  |  color |  quantity
hammer   blue     4
hammer   red      3 
nail     blue     1 
nail     red      6

您在这里的 PK 将是工具和颜色。

【讨论】:

  • 不知道,关于复合键,我将不得不研究并回到这里:D
  • 是 id & date 还是 product & date?
  • @MagicMan 不错。产品。我没有很好地阅读这个问题,看不到那个香蕉!= id。想是因为他将他的 PK 标记为 id,这就是香蕉。顺便说一句,谢谢
  • 是的,这正是我所需要的,很抱歉浪费您的时间提出这么愚蠢的问题...学习的限制...非常感谢,布拉德!
  • 哦,是的,当然,我不小心按下了赞成票,并认为我也接受了,我的错。再次感谢和抱歉浪费您的时间两次,呵呵。
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2014-07-25
相关资源
最近更新 更多