我有一个表(try),有一个主键(pk),几个数据字段(dx,dy,dz)和一个时间字段(td)。在sqlite3中,我想:
REPLACE接近我需要的东西,但是它会插入"插入"或者"替换所有",而我需要"插入"或者"更新一些"。
这是有效的,但这需要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;
答案 0 :(得分:0)
我能够将这些陈述合并到我的要求中,这里仅供参考,供以后可能需要它的人使用。但是,请注意,在事务中使用多个语句(如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);