Insert com caracteres aleatórios PostgreSQL

Sim, é possível, uma implementação simples, pode ser a utilização da função random, essa função vai gerar um número aleatório entre 0 e 1, em composição com a função md5, essa função vai gerar um hash md5 de uma string.

Dessa forma, você pode executar o seguinte comando:

SELECT md5(random()::text);

Repare que na função acima estamos fazendo uma conversão do valor gerado na função random() para o tipo text (um tipo equivalente à string).


Gerando UUID

Se quer gerar valores do tipo UUID então a partir da versão 13 do postgres é possível utilizar a função gen_random_uuid

SELECT gen_random_uuid()

Um exemplo de utilização

Suponha que temos o seguinte esquema:

CREATE TABLE IF NOT EXISTS usuario (
    id UUID DEFAULT gen_random_uuid(),
    nome VARCHAR(32),
    sobrenome VARCHAR(32),
    username VARCHAR(32) UNIQUE,
    PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS verificacao (
    usuario_id UUID REFERENCES usuario(id),
    token VARCHAR(32) NOT NULL,
    criadoem TIMESTAMP
);

Desejamos que sempre que seja adicionado um novo usuário na tabela usuario, seja adicionada uma nova linha na tabela verificacao.

O fluxo acima pode ser implementado utilizando Common Table Expressions usando uma expressão auxiliar novo_usuario vamos inserir um novo valor na tabela verificacao:

WITH novo_usuario AS (
    INSERT INTO usuario (nome, sobrenome, username) VALUES ('eu', 'pessoa', 'eu') RETURNING id
  )
  INSERT INTO verificacao(usuario_id, token, criadoem) VALUES ((SELECT id FROM novo_usuario), md5(random()::text), now());

Depois podemos verificar que a inserção foi feita corretamente da seguinte forma:

select * from usuario u inner join verificacao v ON (u.id = v.usuario_id);

Uma implementação utilizando trigger

Outra maneira de implementar este mesmo fluxo é através de um gatilho (trigger) que vai reagir a um evento de nova linha na tabela usuario, e pode ser feito da seguinte forma:

CREATE OR REPLACE FUNCTION adicionar_nova_verificacao()  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS
$$
BEGIN
    INSERT INTO verificacao(usuario_id, token, criadoem) VALUES (NEW.id, md5(random()::text), now());
    RETURN NEW;
END;
$$

CREATE OR REPLACE TRIGGER adicionar_verificacao AFTER INSERT ON usuario 
REFERENCING NEW TABLE AS novo_usuario
FOR EACH ROW
EXECUTE FUNCTION adicionar_nova_verificacao();

Depois para verificar o funcionamento da função basta inserir uma nova linha na tabela usuario.

INSERT INTO usuario (nome, sobrenome, username) VALUES ('eu', 'pessoa', 'eu');

Depois para verificar o funcionamento correto, basta executar a seguinte consulta:

SELECT * FROM usuario u INNER JOIN verificacao v ON (u.id = v.usuario_id);

O resultado dessa consulta é que deve haver pelo menos uma linha (caso tenha adicionado apenas uma linha na tabela usuario) em que as colunas usuario_id e id são iguais.

No nosso caso os valores aleatórios que são inseridos são os valores da coluna token da tabela verificacao no qual o são obtidos através da  composição da função md5 e a função random.