Код ошибки 23514 в postgresql при вставке в секционированную таблицу - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть таблица в 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))"

enter image description here

Есть ли решение для решения этой проблемы?

С уважением.

...