i有一个表(try),具有主键(PK),几个数据字段(DX,DY,DZ)和一个时间字段(TD)。在sqlite3中,我想:
- 如果不存在(PK),插入记录(PK,DX,DY,DZ)。
- 如果存在记录,请进行更新。
- 在更新期间,如果某些字段(DX,DY)更改为当前时间。 在更新期间
替换与我需要的内容接近,但是它可以执行"插入"或"替换",而我需要"插入"或"更新几个"。
这是有效的东西,但这需要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);