Вставка COALESCE (NULL, по умолчанию)

У меня есть таблицы, которые используют UUID. Я хочу иметь возможность вставить новую строку с UUID или без него, так как иногда клиент будет генерировать UUID, а иногда - нет.

Каждая таблица имеет это в своей основе:

CREATE TABLE IF NOT EXISTS person (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);

Я пытаюсь использовать функцию для вставки строк. Я хотел бы иметь возможность передать идентификатор NULL и получить значение по умолчанию (сгенерированный UUID). У меня есть что-то вроде этого:

CREATE OR REPLACE FUNCTION create_person(
    id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $
BEGIN
    INSERT INTO person( id )
    VALUES (
        COALESCE(id,default)
    );
    RETURN FOUND;
END;
$;

Я пробовал это:

INSERT INTO person ( id ) VALUES (
    COALESCE(id, default),
);

и это:

INSERT INTO person ( id ) VALUES (
  CASE WHEN id IS NULL THEN default ELSE id END
);

Это работает, но повторяет код gen_random_uuid ():

INSERT INTO person ( id ) VALUES (
  COALESCE(id, gen_random_uuid()),
);

Точно так же это работает, но имеет те же проблемы:

INSERT INTO person ( id ) VALUES (
    CASE WHEN id IS NULL THEN gen_random_uuid() ELSE id END
);

Есть ли способ сделать это, где мне не нужно повторятьgen_random_uuid() код?

Будет ли это лучше сделать сplpgsql?

Ответы на вопрос(3)

Ваш ответ на вопрос