在SQlite中将数据插入或更新到表中

时间:2014-03-18 11:51:48

标签: sqlite cordova web-sql unique-index

使用 SQlite

在HTML5 + PhoneGap应用程序中工作

用于更新SQlite中的表格;我正在使用 REPLACE INTO 方法。

这是示例代码; : http://www.sqlfiddle.com/#!7/ccc33/2

模式

CREATE TABLE mytable (
id integer primary key autoincrement,
name VARCHAR(10),
date DATE,
job VARCHAR(16),
hours VARCHAR(16)
);
CREATE UNIQUE INDEX myindex ON mytable(NAME);

此处 NAME 是UNIQUE INDEX值。

查询

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)

VALUES ('BOB', '12/01/01', 'PM','20');

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)

VALUES ('BOB', '12/01/01', 'PM','32');

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)

VALUES ('BOB', '14/01/01', 'PM','35');

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)

VALUES ('BOBg', '12/01/01', 'PM','350');

SELECT * FROM mytable;

但是当运行查询时;我看到主键 id 递增enter image description here。但是当 NAME 相同时我需要它的唯一更新。

这有什么解决方案吗?请帮忙!

2 个答案:

答案 0 :(得分:1)

在查询中(NAME,DATE,JOB,HOURS)或它们的组合存在唯一约束时,如果违反了该记录,则会删除记录并使用新值插入记录。所以密钥id递增

如果您想要类似的东西,UPSERT会这样做:

INSERT OR REPLACE INTO mytable (id, NAME, Date, JOB, HOURS)
 SELECT old.id, new.NAME, new.Date, new.JOB, new.HOURS
 FROM ( SELECT
     'BOB' AS name,
     '12/01/01' AS NAME,
     'PM'  AS JOB,
     '32'  AS JOB
 ) AS new
 LEFT JOIN (
     SELECT id, NAME, Date, JOB, HOURS
     FROM mytable
 ) AS old ON new.NAME= old.NAME;

答案 1 :(得分:0)

创建id列时不要写自动增量。

http://sqlite.org/autoinc.html