Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于基于两列的重复键_Java_Mysql_Sql - Fatal编程技术网

Java 关于基于两列的重复键

Java 关于基于两列的重复键,java,mysql,sql,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(

我的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
产品
香蕉
数量
4
。当天晚些时候,他将插入
苹果
数量
10
。当天他将插入
香蕉
数量
1
苹果
数量
12

明天他也会这样做,插入数量为2的香蕉,但日期为2014年1月18日。这应该是新的一行,因为它是相同的产品,但日期不同

在这种情况下,我需要数据库执行以下操作: 检查是否在2014年1月17日插入了香蕉
。
如果香蕉已于2014年1月17日插入,则更新数量
4+1

第二天,它将检查是否在2014年1月18日插入了香蕉。如果不是,则插入数量
2
。如果是,则更新数量

所以:我不能让任何一列是唯一的,因为苹果和香蕉的日期可以相同,当然还有数量

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

  • 从evolution中选择(产品、日期),其中产品=香蕉,日期=2014年1月18日
    如果返回任何内容,那么我将执行更新。 如果这没有返回任何内容,那么我将执行插入

  • 创建一列将是唯一的
    产品日期
    。例如,我将在其中插入
    banana 17.01.2014
    。这会更容易,但我不喜欢这种方式,因为它很脏

  • 如果我可以做一些类似于重复键上的双精度键的操作,那么所有这些都将非常容易。尝试插入
    香蕉和日期
    。然后,如果组合已经存在,请进行更新

    为使其更简短、更易于理解:

    这是有效的:

    +-------+----------+
    |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|
    +-------+----------+
    
    因此,它们(
    产品
    日期
    )可以自己复制,但不能一起复制

    很抱歉发了这么长的帖子…我希望我没有错过任何简单明了的方法,但我可能会,我当然希望如此,我是一个编程初学者。
    谢谢,祝你晚安

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

    PRIMARY KEY (product, date)
    
    复合主键本质上是一种使用多个键确定事物唯一性的方法。例如,如果您有一家商店只销售蓝色或红色的锤子和钉子,您无法在db中识别锤子或蓝色,您必须同时使用这两种颜色

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

    你在这里的主键是工具和颜色

    在(产品、日期)上有唯一的键!?!?!看起来你在追求产品和日期的独特约束。可以在事实之后添加,也可以将其作为CREATETABLE语句的一部分。之后再这样做会像这样:
    ALTER TABLE evolution ADD CONSTRAINT uc_product UNIQUE(product,date)
    我不知道,关于复合键,我必须研究并回到这里:d是id&date还是product&date?@MagicMan很好。产品。这个问题我读得不够好,看不到那根香蕉我想,因为他把他的PK标记为id,这就是香蕉。谢谢你btwYes,这正是我需要的,抱歉浪费你的时间问这么一个愚蠢的问题…学习的限制…非常感谢,Brad!哦,是的,当然,我不小心按下了向上的投票,我认为我也接受了,我的错。再次感谢你,抱歉浪费了你两次时间,呵呵。