2014-10-01 136 views
3

Ik执行一个在de table中插入一些值的查询,如果ID,Year,rownum(唯一索引)的组合存在,我做一个常规的ON DUPLICATE KEY UPDATE等等该行已更新。查询看起来像这样:MYSQL ON DUPLICATE KEY UPDATE和IGNORE在一个查询中

INSERT INTO data_advertenties_prijzen (`ID`, `year`, `rownum`, `status_prijs`, 
    `datum_dag`, `timestamp_dag`) 
VALUES (100,2014,1,1,'2014-01-01',1388534400), 
     (100,2014,2,1,'2014-07-16',1405468800), 
     (100,2014,3,1,'2014-07-26',1406332800) 
ON DUPLICATE KEY UPDATE 
    status_prijs = VALUES(status_prijs), 
    datum_dag = VALUES(datum_dag), 
    timestamp_dag = VALUES(timestamp_dag) 

那里没有困难,但...。

我也想在同一个查询中为1个值做ON DUPLICATE IGNORE。我也希望在2015年插入一行。例如:(100,2015,1,1,'2015-01-01',1405468800)... 如果已经有一行ID = 100,Year = 2015和rownum = 1,该行的插入必须被忽略。

如何做到这一点?

+0

重复的作品通过检查主键和唯一键。因此,您需要将“年份”和“rownum”这两列设置为唯一键值才能生效。 – 2014-10-01 18:46:23

+0

詹姆斯我做的和第一个查询工作正常,但我也想插入与2015年(年)的行,但是当已经有一排2015年比只有2015年行不能插入... – 2014-10-01 19:00:17

+0

是否有任何原因不要将年份列设置为唯一? – 2014-10-01 19:04:12

回答

1

您可以在ON DUPLICATE子句中有条件地更改这些值。

我做了这个实验,以确保它的工作原理:

INSERT INTO data_advertenties_prijzen VALUES (100, 2014, 1, 7, now(), 1406332800) 
ON DUPLICATE KEY UPDATE 
    status_prijs = IF((id,year,rownum)=(100,2015,1), status_prijs, VALUES(status_prijs)), 
    datum_dag = IF((id,year,rownum)=(100,2015,1), datum_dag, VALUES(datum_dag)), 
    timestamp_dag = IF((id,year,rownum)=(100,2015,1), timestamp_dag, VALUES(timestamp_dag)); 

所以,如果我尝试插入ID /年/ ROWNUM的具体三人组,它只是使用现有的值,否则,如果是一些其他的ID/year/rownum,它使用INSERT中指定的VALUES。

不幸的是,您必须重复每个要更新的列的表达式。

+0

谢谢比尔,我要去测试它。但是,如果我看一下它,就会发现只有在2015年的时候才会进行更新。我想为2014年做插入或更新,如果2015年已经有一排插入了2015年的插入比2015年的行不能插入... – 2014-10-01 18:58:53

+0

请测试它,看看我的解决方案是否满足您的需求。如果没有,请编辑上面的问题,并举例说明你希望它做什么,以及它做了什么,这不是你的期望。 – 2014-10-01 19:19:22

+0

作品!!!!!谢谢! – 2014-10-01 19:32:15

相关问题