O que eu preciso é de uma migração para aplicar restrições exclusivas a uma combinação de colunas. ou seja, para uma people
mesa, uma combinação de first_name
, last_Name
e Dob
deve ser único.
ruby-on-rails
database
rangalo
fonte
fonte
De acordo com howmanyofme.com, "Existem 46.427 pessoas nomeadas John Smith" somente nos Estados Unidos. Isso é cerca de 127 anos de dias. Como isso está bem acima da vida útil média de um ser humano, isso significa que um conflito de DOB é matematicamente certo.
Tudo o que estou dizendo é que essa combinação específica de campos exclusivos pode levar a extrema frustração de usuário / cliente no futuro.
Considere algo realmente único, como um número de identificação nacional, se apropriado.
(Percebo que estou muito atrasado para a festa com este, mas pode ajudar futuros leitores.)
fonte
Você pode adicionar uma restrição sem um índice. Isso dependerá do banco de dados que você estiver usando. Abaixo está um código de migração de amostra para o Postgres.
(tracking_number, carrier)
é uma lista das colunas que você deseja usar para a restrição.Existem diferentes restrições que você pode adicionar. Leia os documentos
fonte
add_index
método. ;)pg_constraint
tabela.Olá Você pode adicionar um índice exclusivo em sua migração às colunas, por exemplo
ou separar índices exclusivos para cada coluna
fonte
No exemplo típico de uma tabela de junção entre usuários e postagens:
Tentar criar dois registros semelhantes gerará um erro no banco de dados (Postgres no meu caso):
por exemplo, fazendo isso:
Exemplo totalmente executável: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
db/schema.rb
gerado: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744afonte
Por uma questão de integridade, e para evitar confusão, aqui estão três maneiras de fazer a mesma coisa:
Adicionando uma restrição exclusiva nomeada a uma combinação de colunas no Rails 5.2+
Digamos que temos a tabela Locais que pertence a um anunciante e tem a coluna reference_code e você deseja apenas 1 código de referência por anunciante. então você deseja adicionar uma restrição exclusiva a uma combinação de colunas e nomeá-la.
Faz:
rails g migration AddUniquenessConstraintToLocations
E faça sua migração parecer algo como este liner:
OU esta versão do bloco.
OU esta versão SQL bruta
Qualquer um destes terá o mesmo resultado, verifique seu
schema.rb
fonte