Solucionado (ver solução)
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