Se você está lidando com o erro: "Violação de restrição de integridade: não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha", você está no artigo certo.
Geralmente você encontra esse erro ao adicionar uma nova coluna a uma tabela e declará-la como uma chave estrangeira.
Em um banco de dados SQL, uma chave estrangeira é um campo de uma tabela usado para estabelecer um link entre os dados de outra tabela. Considere a tabela de clientes abaixo.
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) );
Agora você deseja vincular seus clientes a um grupo. Primeiro você deve adicionar a nova coluna à tabela de clientes que contém a referência à tabela de grupos:
# Create the new column "group_id" ALTER TABLE customers ADD COLUMN group_id INT NOT NULL;
Então você pode adicionar a restrição de chave estrangeira para ativar a relação com a tabela de grupos:
# Add the FK constraints ALTER TABLE customers ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES customers(id);
Quando você executa esta operação de alteração na tabela de clientes, o banco de dados verificará se o ID no campo group_id existe na tabela de grupos.
Durante esta verificação o banco de dados irá gerar o "Erro de violação de integridade" porque a coluna group_id ainda está vazia, portanto não contém nenhuma referência válida na tabela de grupos. Portanto, o mecanismo SQL falha ao tentar aplicar a restrição de chave estrangeira. Isso ocorre porque um valor vazio não é uma chave estrangeira válida para a tabela de grupos.
A ação mais simples é declarar a nova coluna como anulável.
Você pode remover a instrução "NOT NULL" da consulta alter para permitir que a coluna group_id contenha valores nulos.
Esta simples mudança resolverá o problema em primeiro lugar, porque agora a chave estrangeira também pode ser nula. Você pode executar a migração de dados para eventualmente preencher a nova coluna group_id na tabela de clientes e planejar uma nova versão para reintroduzir a restrição "NOT NULL".
Se em sua aplicação um Cliente não pode existir sem um Grupo específico, você deve lembrar que tendo o group_id anulável, seu banco de dados não está ciente desta restrição.
Se você cometer um erro durante a criação da entidade em seu aplicativo, o banco de dados não irá alertá-lo.
Outra solução é adicionar um trabalho de migração de dados entre a consulta de alteração para adicionar a nova coluna e aquela para adicionar a chave estrangeira.
Depois de ter a nova coluna group_id na tabela de clientes, você pode executar um script para preencher esta coluna para linhas existentes com um ID válido da tabela de grupos.
Este é um exemplo de consulta para realizar esta tarefa:
UPDATE customers, groups SET customers.group_id = groups.id Where customers.user_id = groups.user_id;
Em aplicativos modernos, todas essas tarefas são executadas usando a ferramenta de migração. Geralmente está disponível nas estruturas de desenvolvimento de aplicativos mais comuns.
No exemplo abaixo, mostrarei como lidar com o problema de violação de restrição de integridade usando migrações do Laravel.
Crie a migração:
php artisan make:migration add_goup_id_fk_to_customers –table=customers
Você pode dividir a migração em duas partes, conforme mostrado abaixo:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('customers', function (Blueprint $table) { $table->unsignedBigInteger('group_id')->nullable(); }); // Insert default data into the new column DB::raw('UPDATE customers, groups SET customers.group_id = groups.id WHERE customers.user_id = groups.user_id'); Schema::table('customers', function (Blueprint $table) { // Add the FK constraint $table->foreign('group_id')->references('id')->on(groups)->onDelete('cascade'); // Remove the nullable condition eventually; $table->unsignedBigInteger('group_id')->change(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('customers', function (Blueprint $table) { $table->dropForeign('group_id'); $table->dropColumn('group_id'); }); } };
Se você estiver interessado em melhorar o desempenho do banco de dados você pode dar uma olhada no artigo abaixo sobre "Consultas Inteligentes ao Banco de Dados":
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/
Inspector é uma ferramenta de monitoramento de execução de código projetada especificamente para desenvolvedores de software. Você não precisa instalar nada no nível do servidor, basta instalar o pacote do compositor e você está pronto para começar.
Ao contrário de outras plataformas complexas e completas, o Inspector é super fácil e compatível com PHP. Você pode experimentar nosso pacote Laravel ou Symfony.
Se você está procurando automação eficaz, insights profundos e a capacidade de encaminhar alertas e notificações para seu ambiente de mensagens, experimente o Inspector gratuitamente. Registre sua conta.
Ou saiba mais no site: https://inspector.dev
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3