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
.