CREATE TABLE if not exists "o"."A" (     --编号     "Number" bigint NOT NULL,      --……      --创建时间     "CreateTime" timestamp without time zone NOT NULL DEFAULT now(),     --更新时间     "UpdateTime" timestamp without time zone NOT NULL DEFAULT now() ) partition by range("CreateTime");  CREATE UNIQUE INDEX IF NOT EXISTS u_idx_AdsARH_CT_N ON "o"."A"("CreateTime","Number"); CREATE INDEX if not exists idx_AdsARH_AdsCId_AdsAId  ON "orders"."A" USING btree ("CId","AId");   --add partition DO  $do$ DECLARE  r_year record;  r_month record;     v_year integer;     v_month integer;     v_startData date;  v_endData date;     str_sql text;     str_next_month text;     v_schema text:='o';     v_table_preffix_name text:='A';  v_years int[]:= '{2015,2016,2017,2018,2019,     2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,     2030,2031,2032,2033,2034,2035,2036,2037,2038,2039}';     v_months int[]:='{1,2,3,4,5,6,7,8,9,10,11,12}'; BEGIN     for r_year in (   WITH data AS (    SELECT v_years::text[] AS arr   )   SELECT arr[i] AS "v_year"    FROM data, generate_subscripts((SELECT arr FROM data), 1) i  )  LOOP   RAISE NOTICE 'start.... ';   v_year=CAST(coalesce(r_year."v_year", '0') AS integer);    RAISE NOTICE 'v_year: % ', v_year;         continue when v_year is null;    for r_month in (             WITH data AS (                 SELECT v_months::int[] AS arr             )             SELECT arr[i] AS "v_month"                 FROM data, generate_subscripts((SELECT arr FROM data), 1) i         )         LOOP             v_month= CAST(coalesce(r_month."v_month", '0') AS integer);             RAISE NOTICE 'v_month: % ', v_month;             continue when v_month is null;              v_startData=to_date(concat(v_year,v_month), 'yyyymm');             RAISE NOTICE 'v_startData: %,%,%',     v_startData,to_char(v_startData,'YYYYMMDD'),to_char(v_startData,'YYYY-MM-DD');             v_endData=v_startData + interval '1 month';             RAISE NOTICE 'v_endData: %,%', v_endData,to_char(v_endData,'YYYY-MM-DD');             continue when v_startData is null;             continue when v_endData is null;                 str_sql = format('create table if not exists  "%I".%I              partition of "%I".%I              for values from (''%I'') to(''%I'')',              v_schema, concat(v_table_preffix_name,'_',to_char(v_startData,'YYYYMMDD')),    v_schema,v_table_preffix_name,             v_startData,v_endData);             RAISE NOTICE 'str_sql: % ', str_sql;        execute str_sql;          END LOOP;   str_sql = format('create table if not exists  "%I".%I              partition of "%I".%I              DEFAULT',              v_schema, concat(v_table_preffix_name,'_','default'),    v_schema,v_table_preffix_name);         RAISE NOTICE 'str_sql: % ', str_sql;         execute str_sql;   RAISE NOTICE 'end.... ';  END LOOP; END; $do$;



建立分区表的时候(Postgresql 不建议建立主键,这样会引起以后必要的麻烦,如果需要可以建立唯一索引)

主键约束或唯一约束必须包含分区字段。这样才能确保整个分区表内的唯一性,因为每个分区上的唯一约束只维护自身的唯一性。