172 похожих чатов

Приветствую. Подскажите, плиз. Создал таблицу users с полем id. И сделал

у него дефолтное значение: my_function().
Для проверки на уникальность генерации дефолтного значения мне в функции приходится делать запрос к таблице users и к полю id. А для этого приходится прокидывать в функцию название таблицы и поля: my_function('users', 'id').

Вот и появился в связи с этим вопрос - можно ли как-то во время выполнения функции получить контекст - для какого поля какой таблицы она выполняется, чтобы не прокидывать аргументы и оставить my_function() by default?

Что-то типа:
CREATE OR REPLACE FUNCTION my_function() RETURN text AS $$
BEGIN
SELECT 1 FROM current_table WHERE current_column = ...
...
END

8 ответов

14 просмотров

Хм а последовательность то чем не угодила? Или I’d осмысленный?

Vsevolod-Avramov Автор вопроса
Slava Rozhnev SQLtest.online https://phpize.online
trigger function

Ну насколько я понимаю, тригеры нужно навешивать определенные действия. Тут же я говорю о дефолтном значении колонки: CREATE TABLE users ( id integer DEFAULT my_function() CONSTRAINT users_pkey PRIMARY KEY, В случае с триггерами надо делать что-то типа: CREATE TABLE users ( id integer CONSTRAINT users_pkey PRIMARY KEY, ... ) CREATE TRIGGER set_default_users_id BEFORE INSERT OF id ON users FOR EACH ROW EXECUTE FUNCTION my_function(); Мне тут больше нравится всё-таки первый вариант

Vsevolod-Avramov Автор вопроса
Konstantin Zaitsev
Хм а последовательность то чем не угодила? Или I’d...

Ну там что-то типа рандомной строки с префиксом: usr_jsSJWn3282jwnsW

Vsevolod Avramov
Ну там что-то типа рандомной строки с префиксом: u...

А проверять то зачем, если вы сами генеририруете?

Vsevolod-Avramov Автор вопроса

Ну на случай если такая запись уже есть в таблице. Вот сама функция. Проще наверно показать, чем говорить: 5 │ Usage example: 6 │ SELECT prefixed_id_generator(table_name, 'prefix', uniq_column) 7 │ # prefix_jHwn38Nwhs6qP6k 8 │ 9 │ If a prefix is not set, it adds a dash before anyway. 10 │ By default, check the 'id' column. You can redefine it with a third arg. 11 │ */ 12 │ 13 │ CREATE OR REPLACE FUNCTION prefixed_id_generator(tbl_name text, prefix text DEFAULT '', uniq_column text DEFAULT 'id') RETURNS text AS $$ 14 │ DECLARE 15 │ new_id text; 16 │ done bool; 17 │ postfix text; 18 │ BEGIN 19 │ done := false; 20 │ WHILE NOT done LOOP 21 │ postfix := (SELECT string_agg(substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1), '') 22 │ FROM generate_series(1, 15)); 23 │ new_id := prefix || '_' || postfix; 24 │ EXECUTE format('SELECT NOT exists(SELECT 1 FROM %s WHERE %s=$1)', tbl_name, uniq_column) INTO done USING new_id; 25 │ END LOOP; 26 │ RETURN new_id; 27 │ END; 28 │ $$ LANGUAGE PLPGSQL VOLATILE;

Vsevolod Avramov
Ну на случай если такая запись уже есть в таблице....

Вы вот на каждую вставку выполнять собираетесь код на plogsql Хотя модно в url просто иметь user#102251126

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта