Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / TRIGGER, FUNCTION ?, вставка пустого значения как NULL / 8 сообщений из 8, страница 1 из 1
31.03.2005, 13:37
    #32990894
dovbysh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
Есть такая таблица:
Код: 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
31.03.2005, 14:57
    #32991217
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
можно попробовать написать свой каст ... либо ковырять исходники PG и править этот самый каст. либо ковырять свои исходники (что вобщем самый правильный путь)
тригер здесь не поможет.. т.к в проверка типов идет до самого запроса где то в районе парсинга.
...
Рейтинг: 0 / 0
31.03.2005, 15:03
    #32991242
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
есть еще вариант... делаеш в таблице поле "lang_id" как varchar, далее делаеш тригер который при инсерте IF NEW.lang_id = '' THEN NEW.lang_id= NULL
но это затормозит запросы т.к при выборе по lang_id придется его в bigint переколбышивать
...
Рейтинг: 0 / 0
31.03.2005, 15:10
    #32991272
dovbysh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
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
31.03.2005, 15:22
    #32991301
dovbysh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
wbearесть еще вариант... делаеш в таблице поле "lang_id" как varchar, далее делаеш тригер который при инсерте IF NEW.lang_id = '' THEN NEW.lang_id= NULL
но это затормозит запросы т.к при выборе по lang_id придется его в bigint переколбышивать
А можно про тригер по подробнее?
Спасибо.
...
Рейтинг: 0 / 0
31.03.2005, 18:38
    #32991973
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
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
31.03.2005, 18:44
    #32991992
dovbysh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
Спасибо.
Сделаю эти поля varchar(20), забью на правильную сортировку.
...
Рейтинг: 0 / 0
04.04.2005, 18:05
    #32996746
Arkady Sempliyaroff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TRIGGER, FUNCTION ?, вставка пустого значения как NULL
Мне кажется, что тут самое место создать RULE --- написать соответствующий DO INSTEAD.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / TRIGGER, FUNCTION ?, вставка пустого значения как NULL / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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