Supondo que no Brasil - todo brasileiro tem um, e somente um, CPF; - alguns brasileiros têm um, mas somente um, passaporte válido; - alguns brasileiros têm uma, mas somente uma, carteira de motorista (CNH) válida. A definição correta desses atributos numa tabela relacional normalizada seria:
- A)CPF varchar(11) not null CNH varchar(9) UNIQUE Passaporte varchar(9) UNIQUE
Errada, porque o CPF precisa ser único também, e CNH e passaporte, por serem opcionais, não podem ser obrigatórios.
- B)CPF varchar(11) not null UNIQUE CNH varchar(9) UNIQUE Passaporte varchar(9) UNIQUE
Certa, pois o CPF é obrigatório e exclusivo, enquanto CNH e passaporte são opcionais, mas únicos quando existirem.
- C)CPF varchar(11) UNIQUE CNH varchar(9) not null Passaporte varchar(9) not null
Errada, porque inverte a lógica: CPF não pode ficar apenas como unique, e CNH e passaporte não são obrigatórios.
- D)CPF varchar(11) not null CNH varchar(9) null Passaporte varchar(9) null
Errada, porque deixa o CPF sem a restrição de unicidade e trata CNH e passaporte como meramente nulos, sem garantir exclusividade.
- E)CPF varchar(11) null CNH varchar(9) UNIQUE Passaporte varchar(9) UNIQUE
Errada, porque CPF não pode ser nulo, já que todo brasileiro tem um CPF.
Gabarito: B
Em modelagem relacional, a regra do jogo é traduzir a realidade com as restrições certas: se todo brasileiro tem exatamente um CPF, esse atributo deve ser obrigatório e também não pode se repetir. Em banco de dados, isso normalmente significa NOT NULL e UNIQUE ao mesmo tempo. Sem o NOT NULL, o banco ainda permitiria ausência de CPF; sem o UNIQUE, permitiria duplicidade, e aí o cadastro viraria faroeste. Já passaporte e CNH não existem para todos os brasileiros. Como o enunciado diz que apenas alguns têm esses documentos, esses campos devem aceitar nulos. Ao mesmo tempo, para cada pessoa, se houver o documento, ele é único. Então a coluna deve ser NULL e com UNIQUE para impedir dois registros com o mesmo número. A pegadinha aqui é simples e clássica: muita gente acha que UNIQUE já resolve tudo, mas em SQL padrão e na maioria dos bancos, UNIQUE permite valores nulos. Ou seja, ele garante unicidade quando há valor, mas não obriga preenchimento. Para obrigar preenchimento, quem entra em cena é o NOT NULL. Por isso, a alternativa correta é a B: CPF como not null e unique, e CNH e passaporte como unique, admitindo nulo. Essa é a forma mais coerente com a normalização e com as restrições informadas no enunciado.