"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > [Resolvido] Violação de restrição de integridade – dicas rápidas

[Resolvido] Violação de restrição de integridade – dicas rápidas

Publicado em 2024-08-25
Navegar:913

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.

Como resolver o erro de violação de integridade

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.

Migração de dados

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;

Usando migrações Laravel

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/

Novo no Inspetor? Monitore seu aplicativo gratuitamente

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

[Resolved] Integrity constraint violation – Fast tips

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

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