基于两列的重复键

时间:2014-01-16 23:25:50

标签: java mysql sql

我的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。那天晚些时候他会插入{{1}数量为apples。同一天,他将10的数量banana1数量apples插入。{/ p>

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

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

第二天,它会检查4+1上是否插入banana。如果没有,请插入数量为18.01.2014。如果是,请更新数量。

所以:我不能让任何列都是唯一的,因为2apples的日期可以相同,但日期和数量相同。

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

  1. banana 如果这返回任何内容,那么我将执行更新。 如果这不返回任何内容,那么我将执行插入。

  2. 制作一个独特的专栏Select (product,date) from evolution where product=banana AND date=18.01.2014。在其中我将插入例如product-date。这会更容易,但我不喜欢这样,它很脏。

  3. 如果我可以在复制键上执行双重操作,那么这一切都会非常容易。尝试并插入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| +-------+----------+ product)可以自己重复,但不能一起重复。

    很抱歉很长的帖子...我希望我不会错过任何简单而干净的方式,但我只是可能,我当然希望如此,我是编程的初学者。 谢谢,祝你晚安!

1 个答案:

答案 0 :(得分:2)

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

PRIMARY KEY (product, date)

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

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

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