Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Dúvida no Ex. 6 da Aula 3 - Alterando e restringindo o formato das nossas tabelas

Na tentativa de inserir um valor não correspondente aos passados no ENUM, este é inserido normalmente com valor "blank". Ou seja, ele não restringe, apenas joga um valor em branco no caso de não bater com o ENUM, correto?

13 respostas

Na verdade não, Enzo. Se definirmos para forma_pagt, por exemplo, enum('cartao', 'boleto', 'dinheiro'), ao tentarmos inserir uma linha cujo valor de forma_pagt não seja um dos três definidos, recebemos um alerta de erro e a ação não é concluída. Teste você mesmo!

Um exemplo baseado na tabela de compras apresentada no curso. Dou o comando para inserir uma linha cujo valor de forma_pagt não bata com um dos três definidos:

mysql> insert into compras (valor, data, observacoes, recebido, forma_pagt) values (200, '2008-05-14', 'PIZZA', 1, 'cheque');

Recebo, então, um alerta de erro:

ERROR 1265 (01000): Data truncated for column 'forma_pagt' at row 1

Oi Enzo

Se você fazer um insert em um com um valor ENUM que não é esperado é restringido sim e ocorre essa mensagem: Data truncated for column 'columnName'

Que estranho, galera! Aqui insere normalmente, porém com valor "em branco". Talvez seja alguma configuração do MySQL, então!

Se você fazer esse comando :

show create table 'nomeTabela'

ele vai retornar o nome de cada coluna e mostra o seu tipo, você vai ver que o seu campo enum tem um default value que é null.

Talvez seja isso que acontece no seu banco Enzo

Mas então, para funcionar o ENUM devo declará-lo como NOT NULL, também?

Mesmo declarando a coluna como NOT NULL, continua inserindo normalmente com valor "em branco" no caso de não bater com o ENUM. O engraçado é que se insiro com um dos valores passados no ENUM, funciona normalmente, rs.

Enzo, você fez o comando que te pedi ? Cola o resultado aqui por favor.

compras | CREATE TABLE `compras` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `valor` double DEFAULT NULL,
  `data` date DEFAULT NULL,
  `observacoes` varchar(255) NOT NULL,
  `recebido` tinyint(1) DEFAULT '0',
  `forma_pagto` enum('Cartão','Boleto','Dinheiro') NOT NULL,
  `comprador_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `comprador_id` (`comprador_id`),
  CONSTRAINT `compras_ibfk_1` FOREIGN KEY (`comprador_id`) REFERENCES `compradores` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=latin1

o campo forma_pagto não poderá receber branco por estar NOT NULL e deve receber um dos valores do Enum.

Oi Enzo

Pelo que pesquisei, a configuração do MySql está sem esse o parâmetro STRICT_TRANS_TABLES no seu my.cnf, só ir no arquivo e colocar esse cara no sql_mode:

# Recommended in standard MySQL setup
sql_mode=<outrosParametros>,STRICT_TRANS_TABLES

tente fazer isso e me fale ok ?

Esta configuração já está habilitada, Caio.

Vou postar um trecho do SELECT:

| 45 |      500 | 2015-12-02 | PRESENTE PRA MÃE             |        1 | Boleto      |            1 |
| 46 |      255 | 2015-10-18 | PRESENTE DO PAI              |        0 | Boleto      |            1 |
| 47 |      255 | 2015-10-18 | PRESENTE DO IRMAO            |        0 | Cartão      |            1 |
| 55 |   1250.5 | 2015-12-04 | PRESENTE DO PAI              |        0 |             |            1 |
+----+----------+------------+------------------------------+----------+-------------+--------------+

Nota o valor do campo "forma_pagt" no id 55. Tentei fazer um INSERT com valor "Cheque", e ao invés de restringir, ele adicionou esse "blank".

Oi Enzon

Consegue colar o conteúdo do my.cnf ? Só para confirmar que não tem nada de diferente, e também posso fazer uns testes.

solução!
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M 

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES