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

时间:2016-06-03 13:45:23

标签: 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_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万条记录。

目前,报告是在created_at时间戳上过滤的。您可以想象,即使在created_at列上有索引,查询也会慢到5000万条。通过选择要在系统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 BETWEEN子句的任何内容。我还尝试使用子查询和WITH clausule使用generate_series在2012到2020之间生成一系列年份。这一切都没有成功。

1 个答案:

答案 0 :(得分:4)

您不想插入新行,您应该更新您的表格。

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

否则你将有100亿行;)