powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / TRIGGER, FUNCTION ?, вставка пустого значения как NULL
8 сообщений из 8, страница 1 из 1
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32990894
dovbysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE "public"."status_g" (
 "last_state_id" BIGINT,
 "lang_id" BIGINT,
 "name" TEXT,
 "status_graph_id" BIGSERIAL,
 "first_state_id" BIGINT,
 "main_version" INTEGER,
 CONSTRAINT "status_graph_pkey" PRIMARY KEY("status_graph_id")
) WITH OIDS;
Мне нужно, чтобы запросы вида
Код: plaintext
insert into status_g (last_state_id, lang_id, name) values ('4','','test')
нормально работали, т.е. при таком запросе в поле lang_id должно записываться NULL. Сейчас выдается ошибка типа немогу преобразовать к BIGINT.
Помогите написать триггер/функцию, а может такая ситуация "лечиться" установлением какой-нибудь переменной?
Менять запрос на
Код: plaintext
insert into status_g (last_state_id, lang_id, name) values ('4',NULL,'test')
не могу - запросов такого вида в системе тьма.
Спасибо!
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991217
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно попробовать написать свой каст ... либо ковырять исходники PG и править этот самый каст. либо ковырять свои исходники (что вобщем самый правильный путь)
тригер здесь не поможет.. т.к в проверка типов идет до самого запроса где то в районе парсинга.
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991242
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть еще вариант... делаеш в таблице поле "lang_id" как varchar, далее делаеш тригер который при инсерте IF NEW.lang_id = '' THEN NEW.lang_id= NULL
но это затормозит запросы т.к при выборе по lang_id придется его в bigint переколбышивать
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991272
dovbysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wbearможно попробовать написать свой каст ...
Пишу следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE FUNCTION Empty(text) RETURNS BIGINT AS
'
    SELECT
          CASE
              WHEN $1='''' THEN NULL
              else CAST ($1 AS BIGINT)
           end
 '
LANGUAGE 'SQL';
CREATE CAST (text AS BIGINT)
WITH FUNCTION Empty(text)
AS IMPLICIT;
На последнее получаю
Код: plaintext
/* Error : "ERROR:  must be owner of type text or type pg_catalog.int8" */
Вопросы:
Чтобы не было этой ошибки я должен коннектиться от имени postgres?
Правильно ли я пишу функцию и каст?
И на сколько это правильно делать такой каст (снижение производительности?)?
wbear
либо ковырять исходники PG и править этот самый каст. либо ковырять свои исходники (что вобщем самый правильный путь)

Ковырять свои исходники не хочеться, но видимо придется. Вообще очень бы хотелось это решить средствами PostgreSQL.
Спасибо за ответ.
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991301
dovbysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wbearесть еще вариант... делаеш в таблице поле "lang_id" как varchar, далее делаеш тригер который при инсерте IF NEW.lang_id = '' THEN NEW.lang_id= NULL
но это затормозит запросы т.к при выборе по lang_id придется его в bigint переколбышивать
А можно про тригер по подробнее?
Спасибо.
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991973
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Q.Чтобы не было этой ошибки я должен коннектиться от имени postgres?
A. самосабой.. т.к ты переопределяеш уже существующий каст..

Q. Правильно ли я пишу функцию и каст?
A.(вспоминается анегдот ..слыш Мыкола ,бачиш как москали пинги(ping'и) обзывают? -Як? ПЫНГИ... -поубывал бы..)
> else CAST ($1 AS BIGINT)
как думаеш не будит ли у тебя тут рекурсии ? :)


Q.И на сколько это правильно делать такой каст (снижение производительности?)?
A. само сабой будет снижение . чем то придется жертвовать.


Q.А можно про тригер по подробнее?
A. кудаж уж подробнее
общая идея такая: делаем поле lang_id не bigint а text И храним в нем числа..
,а при инсертах и апдейтах проверяем на пустую строку и вставляем в нее NULL

alter table add columt new_lang_id text;
update tables set new_lang_id = lang_id::text;
alter table drop columt lang_id;
alter table rename column new_lang_id to lang_id;

create function my_trg return trigger as '
begin
IF NEW.lang_id = '' THEN
NEW.lang_id= NULL;
end IF;
return NEW;
if NEW.


end;' language ....


create trigger before insert & update .... ;
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32991992
dovbysh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Сделаю эти поля varchar(20), забью на правильную сортировку.
...
Рейтинг: 0 / 0
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
    #32996746
Arkady Sempliyaroff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется, что тут самое место создать RULE --- написать соответствующий DO INSTEAD.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / TRIGGER, FUNCTION ?, вставка пустого значения как NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]