Postgresql 如何在INSERT查询中使用WHERE BEVER子句?

Postgresql 如何在INSERT查询中使用WHERE BEVER子句?,postgresql,Postgresql,我有下表 CREATE TABLE public.ad ( id integer NOT NULL DEFAULT nextval('ad_id_seq'::regclass), uuid uuid NOT NULL DEFAULT uuid_generate_v4(), created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL, cmdb_

我有下表

CREATE TABLE public.ad
(
  id integer NOT NULL DEFAULT nextval('ad_id_seq'::regclass),
  uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
  created_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL,
  cmdb_id integer,
  platform character varying(100),
  bidfloor numeric(15,6),
  views integer NOT NULL DEFAULT 1,
  year integer,
  month integer,
  day integer,
  CONSTRAINT ad_pkey PRIMARY KEY (id),
  CONSTRAINT ad_cmdb_id_foreign FOREIGN KEY (cmdb_id)
      REFERENCES public.cmdb (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT ad_id_unique UNIQUE (uuid)
)
WITH (
  OIDS=FALSE
);
在不太详细的情况下,这个表格记录了全国电子屏幕上广告的所有请求和印象。该表还用于生成报告,由+-5000万条记录组成

目前,在创建的时间戳上对报告进行过滤。您可以想象,对于+-5000万条记录,即使在created_at列上有一个索引,查询也会变慢。通过选择要在系统UI上请求数据的日期来生成报告

年、月和日列是我刚刚添加的新列,以提高报告效率。我希望系统以年、月和日为索引,而不是以日期为索引,所有单独的值

新添加的列仍然为空。我想运行一个查询,在created_at列位于两个日期之间时插入一个值。例如:

INSERT INTO ad (year) VALUES (2016) WHERE created_at BETWEEN '2016-01-01 00:00:00' AND '2016-12-31 23:59:59';

这当然不行。我在网上找不到INSERT语句使用where BEVER子句的任何内容。我还尝试使用子查询和WITH子句,使用generate_series生成2012年到2020年之间的一系列年份。这一切都没有成功。

如果不想插入新行,应该更新表

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE column_name BETWEEN value1 AND value2;

否则您将有1亿行;)

如果不想插入新行,则应更新表

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE column_name BETWEEN value1 AND value2;

否则您将有1亿行;)

INSERT
插入新行,你想
更新
现有行。
INSERT
插入新行,你想
更新
现有行。啊,妈的,我刚刚注意到了。我一直认为可以插入到现有行中。事实是,更新速度非常慢,超过5000万条记录,但为此我会找到另一个解决方案。谢谢您的回答。当然可以,但insert语句不是正确的方法,您必须更新行。为了提高性能,如果db逻辑结构允许,您可以将表拆分为多个子表。我一直认为可以插入到现有行中。事实是,更新速度非常慢,超过5000万条记录,但为此我会找到另一个解决方案。谢谢您的回答。当然可以,但insert语句不是正确的方法,您必须更新行。为了提高性能,如果db逻辑结构允许,可以将表拆分为多个子表