Acabei de importar um monte de dados para uma tabela MySQL e tenho uma coluna "GUID" que quero basicamente preencher todas as linhas existentes com novos e exclusivos GUIDs aleatórios.
Como faço isso no MySQL?
eu tentei
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
E fazer com que todos os campos sejam iguais
Respostas:
Não tenho certeza se é a maneira mais fácil, mas funciona. A ideia é criar um gatilho que faça todo o trabalho para você, então, executar uma consulta que atualize sua tabela e, finalmente, descartar este gatilho:
Então execute
E
DROP TRIGGER beforeYourTableUpdate
;ATUALIZAÇÃO Outra solução que não usa gatilhos, mas requer chave primária ou índice exclusivo:
ATUALIZE mais uma vez: Parece que sua consulta original também deve funcionar (talvez você não precise
WHERE columnID is not null
, então todo o meu código extravagante não é necessário.fonte
UUID
for implementado corretamente (e eu acredito que seja), você deve ser capaz de criar um índice exclusivo sem verificar se há duplicatas.Tive a necessidade de adicionar uma coluna de chave primária guid em uma tabela existente e preenchê-la com GUIDs exclusivos e esta consulta de atualização com seleção interna funcionou para mim:
Tão simples :-)
fonte
UUID
é gerado com base na máquina e no carimbo de data / hora . Como uma consulta que leva milissegundos para ser executada, eles devem estar muito próximos ... mas nunca iguais ... uma coisa boa para garantir a você, é adicionar umUNIQUE
índice a essa coluna.UPDATE sri_issued_quiz SET quiz_id=uuid();
A solução aprovada cria IDs exclusivos, mas à primeira vista eles parecem idênticos, apenas os primeiros caracteres diferem.
Se você deseja chaves visivelmente diferentes, tente isto:
Estou usando a versão do servidor MySQL: 5.5.40-0 + wheezy1 (Debian)
fonte
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
Query não é muito bonito, mas faz o trabalho.fonte
Apenas uma pequena adição a fazer, pois acabei com um resultado estranho ao tentar modificar os UUIDs conforme eram gerados. Descobri que a resposta de Rakesh é a mais simples e funciona bem, exceto nos casos em que você deseja remover os travessões.
Para referência:
Isso funcionou perfeitamente sozinho. Mas quando eu tentei isso:
Então, todos os valores resultantes eram os mesmos (não sutilmente diferentes - verifiquei quádruplamente com uma
GROUP BY some_field
consulta). Não importa como coloquei os parênteses, acontece a mesma coisa.Parece que, ao cercar a subconsulta para gerar um UUID com REPLACE, ela só executa a consulta UUID uma vez, o que provavelmente faz sentido como uma otimização para desenvolvedores muito mais inteligentes do que eu, mas não para mim.
Para resolver isso, acabei de dividi-lo em duas consultas:
Solução simples, obviamente, mas espero que isso economize o tempo que acabei de perder.
fonte
Parece um erro de digitação simples. Você não quis dizer "... where columnId is null"?
fonte
WHERE
cláusula. E os valores gerados são muito semelhantes, portanto, deve-se examiná-los de perto para ver se são realmente diferentes.Enfrentei principalmente o mesmo problema. No meu caso, uuid é armazenado como BINARY (16) e tem restrições NOT NULL UNIQUE. E eu enfrentei o problema quando o mesmo UUID foi gerado para cada linha, e a restrição UNIQUE não permite isso. Portanto, esta consulta não funciona:
UNHEX(REPLACE(uuid(), '-', ''))
Mas para mim funcionou, quando usei essa consulta com seleção interna aninhada:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
Em seguida, é produzido um resultado exclusivo para cada entrada.
fonte
fonte
MYsql UPDATE tablename SET columnName = UUID ()
oracle UPDATE tablename SET columnName = SYS_GUID ();
SQLSERVER UPDATE tablename SET columnName = NEWID () ;;
fonte
fonte