我的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
的数量banana
和1
数量apples
插入。{/ p>
明天他会这样做,插入12
,数量为bananas
,但是在2
日期。这应该是一个新行,因为它是相同的产品,但是在不同的日期。
在这种情况下,我需要我的数据库执行以下操作:
检查18.01.2014
上是否插入banana
。如果没有,请插入数量17.01.2014
。
如果已在0+4
插入香蕉,请更新数量17.01.2014
。
第二天,它会检查4+1
上是否插入banana
。如果没有,请插入数量为18.01.2014
。如果是,请更新数量。
所以:我不能让任何列都是唯一的,因为2
和apples
的日期可以相同,但日期和数量相同。
我怎样才能做到这一点? 我考虑过几种方法,但效率不高:
banana
如果这返回任何内容,那么我将执行更新。
如果这不返回任何内容,那么我将执行插入。
制作一个独特的专栏Select (product,date) from evolution where product=banana AND date=18.01.2014
。在其中我将插入例如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|
+-------+----------+
和product
)可以自己重复,但不能一起重复。
很抱歉很长的帖子...我希望我不会错过任何简单而干净的方式,但我只是可能,我当然希望如此,我是编程的初学者。 谢谢,祝你晚安!
答案 0 :(得分:2)
听起来你想要产品和日期上的复合键。
PRIMARY KEY (product, date)
复合主键本质上是一种使用多个键确定事物唯一性的方法。例如,如果您的商店只销售蓝色或红色的锤子和钉子,您无法将数据库中的那些标识为锤子或蓝色,您必须同时使用它们
tool | color | quantity
hammer blue 4
hammer red 3
nail blue 1
nail red 6
你的PK在这里将是工具和颜色。