&引用;“如果存在”;在PostgreSQL中-创建一个查询,该查询在记录存在时更新记录,在记录不存在时插入记录
我想做一个查询“如果在那一秒钟内有一条记录并且这个传感器id存在,用提供的新值更新它,否则用那个值、传感器id和时间创建一条记录” 我成功创建了此查询:&引用;“如果存在”;在PostgreSQL中-创建一个查询,该查询在记录存在时更新记录,在记录不存在时插入记录,sql,postgresql,Sql,Postgresql,我想做一个查询“如果在那一秒钟内有一条记录并且这个传感器id存在,用提供的新值更新它,否则用那个值、传感器id和时间创建一条记录” 我成功创建了此查询: DO $do$ BEGIN IF EXISTS ( SELECT 1 FROM public.measurement_pm2_5 WHERE measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY
DO
$do$
BEGIN
IF EXISTS (
SELECT
1
FROM
public.measurement_pm2_5
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2
) THEN UPDATE
public.measurement_pm2_5
SET
measurement_value = 27
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2;
ELSE INSERT
INTO
public.measurement_pm2_5
( sensor_id, measurement_time, measurement_value )
VALUES
( 2, TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS'), 27 );
END IF;
END;
$do$
LANGUAGE plpgsql;
SELECT
1
FROM
public.measurement_pm2_5
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2
尽管此查询:
DO
$do$
BEGIN
IF EXISTS (
SELECT
1
FROM
public.measurement_pm2_5
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2
) THEN UPDATE
public.measurement_pm2_5
SET
measurement_value = 27
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2;
ELSE INSERT
INTO
public.measurement_pm2_5
( sensor_id, measurement_time, measurement_value )
VALUES
( 2, TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS'), 27 );
END IF;
END;
$do$
LANGUAGE plpgsql;
SELECT
1
FROM
public.measurement_pm2_5
WHERE
measurement_time >= TO_TIMESTAMP('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS')
AND measurement_time < TO_TIMESTAMP('06.07.2016 23:28:44', 'DD.MM.YYYY HH24:MI:SS')
AND sensor_id = 2
从您的SQL代码很容易看出您对过程编程语言很有经验。不过,PL/pgSQL需要不同的思维方式。仔细阅读并开始思考成功或失败的集合和操作。这根本不是要贬低你;从一位看到了这两方面的程序员同事那里得到的建议也是很好的 在这种情况下,只需尝试
更新
,如果失败,则执行插入
DO $do$
DECLARE
obs timestamp := to_timestamp('06.07.2016 23:28:43', 'DD.MM.YYYY HH24:MI:SS');
BEGIN
UPDATE public.measurement_pm2_5
SET measurement_value = 27
WHERE measurement_time = date_trunc('second', obs)
AND sensor_id = 2;
IF NOT FOUND THEN
INSERT INTO public.measurement_pm2_5
(sensor_id, measurement_time, measurement_value)
VALUES (2, obs, 27);
END IF;
END;
$do$ LANGUAGE plpgsql;
你的数据类型是什么?我用
CREATE TABLE measurement\u pm2\u 5(measurement\u time timestamp不为NULL,sensor\u id integer不为NULL默认值1,measurement\u value integer不为NULL默认值1)测试了它,没有OID代码>并且它按预期工作。我更新了我的问题。为什么您认为行没有更新?您用于测试查询的客户端软件是什么do
语句本身不返回任何有用的信息(发生错误时除外)。只需将您的update
语句更改为updatepublic.measurement\u pm2\u 5设置measurement\u value=measurement\u value+0.01…
,例如,以确保所有操作都正常(或不正常)。哦。。。你说得对!它实际上起作用了:“PostgreSQL的SQL管理器Lite”是个骗子!我觉得很尴尬……这就是精神所在!:)谢谢你的回答。这个查询看起来比我的要清楚得多,但仍然不起作用。很明显我做错了什么,但我不知道是什么。奇怪的是,SELECT
(我问题中的第二个查询)返回一条记录,但提供的查询影响0行。