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 不建议建立主键,这样会引起以后必要的麻烦,如果需要可以建立唯一索引)
主键约束或唯一约束必须包含分区字段。这样才能确保整个分区表内的唯一性,因为每个分区上的唯一约束只维护自身的唯一性。