【问题标题】:Insert or Update data into tables in SQlite在 SQlite 中的表中插入或更新数据
【发布时间】:2014-03-18 11:51:47
【问题描述】:

我正在使用 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 是唯一索引值。

查询

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 增加了 。但是当 NAME 相同时,我需要它唯一的更新。

有什么解决办法吗?请帮忙!

【问题讨论】:

    标签: sqlite cordova web-sql unique-index


    【解决方案1】:

    在您的查询中,当 (NAME、DATE、JOB、HOURS) 或其组合存在唯一约束并且违反了该约束时,记录将被删除并插入新值。所以 key 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;
    

    【讨论】:

      【解决方案2】:

      创建 id 列时不要写自增。

      http://sqlite.org/autoinc.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 2014-02-02
        • 1970-01-01
        相关资源
        最近更新 更多