terça-feira, 8 de maio de 2007

Constrição de Dados em MySQL

Hoje vou falar alguma coisa sobre constrição de dados em bancos MySQL.

A constrição de dados é uma ferramenta que podemos utilizar quando queremos que um campo da tabela tenha uma lista definida de valores. Por exemplo, o campo sexo de uma tabela pessoa deve receber apenas os valores "M" ou "F".

No MySQL, isso é feito através de um tipo de dado chamado ENUM (enumerador). O funcionamento é similar ao Enumerador de Java, que escrevi aqui há algum tempo.

Vamos criar uma tabela pessoa de exemplo. Os campos são: nome, idade e sexo.

O script de criação fica assim:

CREATE TABLE `test`.`pessoa` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(60) NOT NULL,
`idade` INTEGER UNSIGNED,
`sexo` ENUM ('F','M'),
PRIMARY KEY (`id`)
);

A coluna sexo poderá receber os seguintes valores:

NULL
'M'
'F'

Caso um comando INSERT seja enviado ao banco com um parâmetro diferente dos acima, uma mensagem Data truncated for colunm 'sexo' at row 1 será emitida.

Fiz alguns testes e detectei o seguinte problema: Caso seja enviado um comando INSERT com o parâmetro '0' (zero) na coluna sexo, O banco de dados insere um registro com a coluna sexo vazia (não é o valor NULL, é coma uma String vazia). Ainda não sei porque isso ocorre.

Da mesma forma, um ENUM que aceita valores 0 e 1 - ENUM ('0','1') - quando recebe o valor 2, insere um registro com o valor 1. Estranho né?

Um outro problema é que a ferramenta MySQL Query Browser não cria campos do tipo ENUM. Aparentemente, o problema é que o wizard de criação / edição de tabelas não aceita o caracter ' (aspas simples) e, por isso, não é possível definir os valores do ENUM. Isso pode ser contornado com a inserção manual do script de criação da tabela.

Assim que tiver uma resposta para todas essas dúvidas, coloco um post aqui.

Referência:

http://dev.mysql.com/doc/refman/5.1/en/enum.html

Até breve!

Nenhum comentário: