У меня есть таблица в postgresql со структурой, такой как:
CREATE TABLE public.user_event_firebase
(
user_id character varying(32) NOT NULL,
event_name character varying(255) NOT NULL,
timestamp bigint NOT NULL,
platform character varying(255) NOT NULL,
created_at timestamp without time zone DEFAULT now()
)
и я создал таблицу разделов по месяцам, например tableA_YYYY_MM
, где YYYY - год, MM - месяц по процедуре, например:
CREATE OR REPLACE FUNCTION public.create_partition_table_function(date, date)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
create_query text;
index_query text;
BEGIN
FOR create_query, index_query IN SELECT
'create table if not exists user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| '() inherits ( user_event_firebase );',
'create index if not exists user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| '_time on user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| ' ( timestamp,event_name,platform,user_id );'
FROM generate_series( $1, $2, '1 month' ) AS d
LOOP
EXECUTE create_query;
EXECUTE index_query;
END LOOP;
END;
$function$
Я создал вставку в эти многораздельные таблицы с помощью функции insert_by_partition_function_3
CREATE OR REPLACE FUNCTION public.insert_by_partition_function_3()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
EXECUTE 'insert into user_event_firebase_'
|| to_char(to_timestamp(NEW.timestamp / 1000), 'YYYY_MM' )
|| ' values ( $1, $2, $3, $4 )' USING NEW.user_id, NEW.event_name, NEW.timestamp, NEW.platform;
RETURN NULL;
END;
$function$
Применить триггер
CREATE TRIGGER partition_trigger_function_1
BEFORE INSERT
ON user_event_firebase
FOR each ROW
EXECUTE PROCEDURE insert_by_partition_function_3() ;
Но когда я вставляю в эти многораздельные таблицы. Выдает ошибку о 23514: check_violation [Нарушение ограничения целостности]
{ "имя": "ошибка", "длина": 539, "тяжесть": "ERROR", "код": "23514", "деталь": "В противном случае
строка содержит (5abd344fa9dd172024b8b661, reg_wal_continue_v6,
1522530933094, ios, 2018-09-06 17: 26: 54.98615). "," Where ":" SQL
оператор \ "вставить в значения user_event_firebase_2018_04 ($ 1, $ 2,
$ 3, $ 4) \ "\ nPL / pgSQL функция insert_by_partition_function_3 () строка 3
в
ВЫПОЛНИТЬ " "схема": "общественность", "стол": "user_event_firebase_2018_04", "ограничение": "user_event_firebase_2018_04_created_at_check", "файл": "execMain.c", "линия": "1760", "рутина":" ExecConstraints "}
Когда я получаю ограничение из таблицы, у меня есть такая информация, как
"user_event_firebase_2018_04_created_at_check","2200","c",f,f,t,"60055","0","0","0"," "," "," ",t,0,f,"{5}",null,null,null,null,null,"{BOOLEXPR :boolop and :args ({OPEXPR :opno 2374 :opfuncid 2368 :opresulttype 16 :opretset false :opcollid 0 :inputcollid 0 :args ({VAR :varno 1 :varattno 5 :vartype 1114 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 5 :location 64} {CONST :consttype 1082 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 83 :constvalue 4 [ 9 26 0 0 0 0 0 0 ]}) :location 75} {OPEXPR :opno 2371 :opfuncid 2364 :opresulttype 16 :opretset false :opcollid 0 :inputcollid 0 :args ({VAR :varno 1 :varattno 5 :vartype 1114 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 5 :location 100} {CONST :consttype 1082 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 118 :constvalue 4 [ 39 26 0 0 0 0 0 0 ]}) :location 111}) :location 96}","((created_at >= '2018-04-01'::date) AND (created_at < '2018-05-01'::date))"
Есть ли решение для решения этой проблемы?
С уважением.