Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“如果存在”;在PostgreSQL中-创建一个查询,该查询在记录存在时更新记录,在记录不存在时插入记录_Sql_Postgresql - Fatal编程技术网

&引用;“如果存在”;在PostgreSQL中-创建一个查询,该查询在记录存在时更新记录,在记录不存在时插入记录

&引用;“如果存在”;在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

我想做一个查询“如果在那一秒钟内有一条记录并且这个传感器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 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行。