在没有主键的情况下在表中插入其他更新

时间:2019-01-13 06:39:05

标签: java sql sqlite

假设我有一个空表'tbl_test',其中有3列,并且没有主键;    column1 column2 是字符串, column3 是int

  

然后我设置了一个函数 myFunc(column1Data,column2Data) {

     

//我希望它是这样的

     

如果我的表中存在column1Data AND column2Data,它将更新并   增加我的column3

     

否则,如果column1Data OR column2Data不存在,它将插入   column1Data,column2Data和column3将设置为0

     

}

我已经尝试过此解决方案https://stackoverflow.com/a/4330694

这是我的代码:https://www.db-fiddle.com/f/cE1FSJawQJFjSHsk93Lrjt/0

CREATE TABLE tbl_test (
    column1 varchar(255),
    column2 varchar(255),
    column3 int(12)
);

INSERT OR REPLACE INTO tbl_test (column1, column2, column3) 
  VALUES (  COALESCE((SELECT column1 FROM tbl_test WHERE column1 = 'column1Data'), 'column1Data') ,
            COALESCE((SELECT column2 FROM tbl_test WHERE column2 = 'column2Data'), 'column2Data') ,
            COALESCE((SELECT SUM(column3+1) AS Total FROM tbl_test WHERE column1 = 'column1Data' AND column2 = 'column2Data'), 0)
          );

INSERT OR REPLACE INTO tbl_test (column1, column2, column3) 
  VALUES (  COALESCE((SELECT column1 FROM tbl_test WHERE column1 = 'column1Data'), 'column1Data') ,
            COALESCE((SELECT column2 FROM tbl_test WHERE column2 = 'column2Data'), 'column2Data') ,
            COALESCE((SELECT SUM(column3+1) AS Total FROM tbl_test WHERE column1 = 'column1Data' AND column2 = 'column2Data'), 0)
          );

INSERT OR REPLACE INTO tbl_test (column1, column2, column3) 
  VALUES (  COALESCE((SELECT column1 FROM tbl_test WHERE column1 = 'column1Data'), 'column1Data') ,
            COALESCE((SELECT column2 FROM tbl_test WHERE column2 = 'column2DataNew'), 'column2DataNew') ,
            COALESCE((SELECT SUM(column3+1) AS Total FROM tbl_test WHERE column1 = 'column1Data' AND column2 = 'column2DataNew'), 0)
          );

如果column1Data OR 列2Data中的任何一个不存在,则会插入新数据,并将column3 = 0设置为正确

但是,如果column1Data AND column2Data存在,它将插入新行并增加column3,而不是对其进行更新

1 个答案:

答案 0 :(得分:0)

在SQLite 3.24+中,您可以使用upsert。首先从前两列的唯一约束开始:

create unique index unq_tbl_test_column1_column2 on tbl_test(column1, column2);

在创建列3时为其添加默认值0。

然后,您可以表达自己想要的内容:

insert into tbl_test (column1, column2)
    values (?, ?)
    on conflict (column1, column2)
        do update set column3 = column3 + 1;