1
resposta

[Dúvida] Inserindo linhas com SELECT

Ao longo das aulas de SQLite online, foi apresentado como inserir linhas com SELECT.
Segui exatamente o passo a passo apresentado no video tanto na importação quando na inserção de dados, porém utilizando o MySQL. Entretanto não foi possível a inserção dos dados de tabelapedidos na tabelapedidosgold sem a utilização do INNER JOIN...ON, o que pode ter acontecido?

`CREATE TABLE tabela_pedidos_gold (
id_pedido_gold INT PRIMARY KEY,
data_de_pedido_gold DATE,
status_gold VARCHAR (255),
total_pedido_gold DECIMAL (10, 2),
cliente_gold INT,
data_de_envio_estimada_gold DATE,
FOREIGN KEY (cliente_gold) REFERENCES tabela_clientes (id_cliente)
);

INSERT INTO tabela_pedidos_gold (
id_pedido_gold,
data_de_pedido_gold,
status_gold,
total_pedido_gold,
cliente_gold,
data_de_envio_estimada_gold
)
SELECT
id,
data_do_pedido,
status,
total_do_pedido, cliente,
data_de_envio_estimada
FROM tabela_pedidos
INNER JOIN tabela_clientes
ON tabela_pedidos.cliente = tabela_clientes.id_cliente
WHERE Total_do_Pedido >= 400;

SELECT * FROM tabela_pedidos_gold;`

1 resposta

Oi Gabriel, tudo bem?!

O que aconteceu no seu caso está relacionado ao comportamento do MySQL em relação à chave estrangeira, e não ao INSERT ... SELECT em si.
No SQLite online, a verificação de foreign key pode estar desativada por padrão no ambiente utilizado. Já no MySQL, a integridade referencial é verificada automaticamente.

Como sua tabela possui:

FOREIGN KEY (cliente_gold) REFERENCES tabela_clientes (id_cliente)

Se existir algum registro em tabela_pedidos cujo campo cliente não exista em tabela_clientes, o MySQL bloqueia a inserção.

Quando você utilizou:

INNER JOIN tabela_clientes
ON tabela_pedidos.cliente = tabela_clientes.id_cliente

você garantiu que apenas pedidos com cliente válido fossem inseridos, evitando o erro de chave estrangeira.

Portanto, o JOIN não é obrigatório para a sintaxe funcionar. Ele só se tornou necessário porque provavelmente há registros em tabela_pedidos sem correspondência em tabela_clientes.

Se os dados estiverem consistentes, o comando abaixo funcionará normalmente no MySQL:

INSERT INTO tabela_pedidos_gold (...)
SELECT ...
FROM tabela_pedidos
WHERE total_do_pedido >= 400;

Nesse caso, a diferença não está no comando, mas sim na validação mais rigorosa do MySQL em comparação ao SQLite.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!