如何在sqlite3中组合插入语句和更新语句



i有一个表(try),具有主键(PK),几个数据字段(DX,DY,DZ)和一个时间字段(TD)。在sqlite3中,我想:

  1. 如果不存在(PK),插入记录(PK,DX,DY,DZ)。
  2. 如果存在记录,请进行更新。
  3. 在更新期间,如果某些字段(DX,DY)更改为当前时间。
  4. 在更新期间

替换与我需要的内容接近,但是它可以执行"插入"或"替换",而我需要"插入"或"更新几个"。

这是有效的东西,但这需要2个语句一个要检查记录是否首先存在,然后在附近进行插入或更新。如何在单个语句中执行这些?

-- Example table
CREATE TABLE try(
    pk INTEGER  PRIMARY KEY,
    dx TEXT NOT NULL,   -- update td if this changes.
    dy TEXT,            -- update td if this changes.
    dz TEXT,            -- no need to change td, if this changes.
    td DATETIME DEFAULT (strftime('%s','now'))
);
-- 1. Check if record exists or not.
SELECT pk from try where pk=1;
-- 2.a If record does not exist, do this insert.
INSERT INTO try(pk, dx, dy, td) VALUES(1, 'data_x', 'data_y', 'data_z', strftime('%s', 'now'));
-- 2.b If record exists, update but be selective with td.
UPDATE try SET dx='data_x',
               dy='data_y_new',
               dz='data_z_new',
               td=(CASE WHEN (try.dx IS NOT 'data_x' OR try.dy IS NOT 'data_y_new') THEN strftime('%s','now')
                        ELSE try.td
                   END)
           WHERE pk=1;

我能够为我的要求组合陈述,在这里仅用于参考,对于以后可能需要它的其他人。但是,请注意,通常在交易中使用多个语句(如CL所建议)可能更简单。

REPLACE INTO try VALUES(1,
                        'data_x',
                        'data_y_new',
                        'data_z_new',
                        CASE WHEN EXISTS(SELECT td FROM try AS try2 WHERE (try2.pk IS 1 AND try2.dx IS 'data_x' AND try2.dy IS 'data_y_new'))
                             THEN (SELECT td FROM try AS try3 WHERE (try3.pk IS 1))
                             ELSE strftime('%s','now')
                             END);

最新更新