O administrador de banco de dados do TJSE deverá criar um script em MySQL para realizar a carga de dados da TABELA A para a TABELA B, considerando que: • a TABELA A foi criada pelo script: CREATE TABLE a ( id INT AUTO_INCREMENT PRIMARY KEY, descricao VARCHAR(255) NOT NULL, custo DECIMAL(10, 2), tipo CHAR(1), CHECK (tipo IN ('A', 'B', 'C')) ); • a TABELA B foi criada pelo script: CREATE TABLE b ( id INT AUTO_INCREMENT PRIMARY KEY, descricao VARCHAR(255) NOT NULL, custo DECIMAL(10, 2) NOT NULL, tipo TINYINT, CHECK (tipo IN (1,2,3)) ); • A TABELA A foi carregada e a coluna CUSTO possui valores NULOS. O script para carregar os dados da TABELA A para a TABELA B é:
- A)INSERT INTO b SELECT * FROM a; COMMIT;
Errada, porque tenta copiar tudo sem tratar os nulos de custo nem converter o tipo CHAR para TINYINT.
- B)INSERT INTO b (id, descricao, custo, tipo) SELECT id, descricao, custo, tipo FROM a WHERE custo is NOT NULL; COMMIT;
Errada, porque filtra custo nao nulo, mas ainda deixa tipo incompatível com a regra da tabela B.
- C)INSERT INTO b (id, descricao, custo, tipo) SELECT id, descricao, custo, tipo FROM a WHERE custo is NOT NULL AND tipo IN (1, 2, 3); COMMIT;
Errada, porque o filtro tipo IN (1, 2, 3) nao faz sentido para a TABELA A, onde tipo vale 'A', 'B' ou 'C'.
- D)INSERT INTO b (id, descricao, custo, tipo) SELECT id, descricao, COALESCE(custo, 0) as custo, CASE tipo WHEN 'A' THEN 1 WHEN 'B' THEN 2 WHEN 'C' THEN 3 END AS tipo FROM a; COMMIT;
Certa, porque substitui custo nulo por 0 e converte 'A', 'B' e 'C' para 1, 2 e 3, atendendo as restricoes da tabela B.
- E)INSERT INTO b (id, descricao, custo, tipo) SELECT id, descricao, COALESCE(custo, 0) as custo, CASE tipo WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END AS tipo FROM a; COMMIT;
Errada, porque faz a conversao ao contrario, tentando transformar valores numericos em letras, o que nao corresponde aos dados da TABELA A.
Gabarito: D
Quando voce faz carga de dados entre tabelas, o primeiro cuidado e verificar se os tipos e as restricoes da tabela de destino aceitam os valores de origem. Aqui, a TABELA B tem a coluna custo como NOT NULL e a coluna tipo como TINYINT com valores 1, 2 ou 3. Ja a TABELA A guarda tipo como CHAR(1), com 'A', 'B' e 'C', e ainda tem custo nulo em parte dos registros. Por isso, nao basta copiar tudo no piloto automatico. Se voce tentar levar custo nulo para uma coluna NOT NULL, o MySQL vai barrar a insercao. E se tentar levar 'A', 'B' e 'C' para uma coluna numerica, tambem vai dar incompatibilidade logica com a regra de negocio da tabela B. O item D resolve os dois problemas: usa COALESCE(custo, 0) para substituir valores nulos por zero, atendendo ao NOT NULL, e usa CASE para converter 'A' em 1, 'B' em 2 e 'C' em 3, respeitando o CHECK da tabela B. Em outras palavras, ele faz a traducao correta dos dados antes de inserir. Em SQL, isso e o tipo de raciocinio esperado em cargas entre tabelas com estruturas diferentes. Detalhe importante: mesmo quando o enunciado nao fala de transacao, o COMMIT ao final e adequado se o script estiver dentro de uma transacao. Em concursos, a banca gosta de testar exatamente essa atencao aos dominios de dados e a conversao de tipos, nao so o comando INSERT em si.