"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > [Resuelto] Violación de la restricción de integridad: consejos rápidos

[Resuelto] Violación de la restricción de integridad: consejos rápidos

Publicado el 2024-08-25
Navegar:870

Si estás lidiando con el error: "Violación de la restricción de integridad: no se puede agregar ni actualizar una fila secundaria: falla una restricción de clave externa", estás en el artículo correcto.

Por lo general, encuentra este error cuando agrega una nueva columna a una tabla y la declara como clave externa.

En una base de datos SQL, una clave externa es un campo en una tabla que se utiliza para establecer un vínculo entre los datos de otra tabla. Considere la siguiente tabla de clientes.

CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255)
);

Ahora desea vincular a sus clientes a un grupo. Primero debes agregar la nueva columna a la tabla de clientes que contiene la referencia a la tabla de grupos:

# Create the new column "group_id"
ALTER TABLE customers
ADD COLUMN group_id INT NOT NULL;

Luego puede agregar la restricción de clave externa para activar la relación con la tabla de grupos:

# Add the FK constraints
ALTER TABLE customers
ADD CONSTRAINT fk_group_id
FOREIGN KEY (group_id)
REFERENCES customers(id);

Cuando ejecute esta operación de modificación en la tabla de clientes, la base de datos verificará que el ID en el campo group_id exista en la tabla de grupos.

Durante esta verificación, la base de datos generará el "Error de violación de integridad" porque la columna group_id aún está vacía, por lo que no contiene ninguna referencia válida en la tabla de grupos. Por lo tanto, el motor SQL falla al intentar aplicar la restricción de clave externa. Es porque un valor vacío no es una clave externa válida para la tabla de grupos.

Cómo solucionar el error de violación de integridad

La acción más sencilla es declarar la nueva columna como anulable.

Puede eliminar la instrucción "NOT NULL" de la consulta de modificación para permitir que la columna group_id contenga valores nulos.

Este simple cambio resolverá el problema en primer lugar, porque ahora la clave externa también puede ser nula. Puede ejecutar la migración de datos para completar eventualmente la nueva columna group_id en la tabla de clientes y planificar una nueva versión para reintroducir la restricción "NO NULA".

Si en tu aplicación un Cliente no puede existir sin un Grupo específico, debes recordar que al tener el group_id anulable, tu base de datos no tiene conocimiento de esta restricción.

Si cometes un error durante la creación de la entidad en tu aplicación, la base de datos no te alertará.

Migración de datos

Otra solución es agregar un trabajo de migración de datos entre la consulta de modificación para agregar la nueva columna y la que agrega la clave externa.

Una vez que tenga la nueva columna group_id en la tabla de clientes, puede ejecutar un script para completar esta columna para las filas existentes con una ID válida de la tabla de grupos.

Este es un ejemplo de consulta para realizar esta tarea:

UPDATE customers, groups
SET customers.group_id = groups.id
Where customers.user_id = groups.user_id;

Usando migraciones de Laravel

En las aplicaciones modernas, todas estas tareas se realizan mediante la herramienta de migración. Suele estar disponible en los marcos de desarrollo de aplicaciones más comunes.

En el siguiente ejemplo, le mostraré cómo lidiar con el problema de violación de la restricción de integridad usando migraciones de Laravel.

Crear la migración:

php artisan make:migration add_goup_id_fk_to_customers –table=customers

Puedes dividir la migración en dos partes como se muestra a continuación:

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');
        });
    }
};

Si está interesado en mejorar el rendimiento de la base de datos, puede consultar el siguiente artículo sobre "Consultas inteligentes de bases de datos":
https://inspector.dev/how-to-accelerate-application-rendimiento-con-smart-sql-queries/

¿Nuevo en el inspector? Supervise su aplicación de forma gratuita

Inspector es una herramienta de monitoreo de ejecución de código diseñada específicamente para desarrolladores de software. No necesita instalar nada a nivel de servidor, simplemente instale el paquete de compositor y estará listo para comenzar.

A diferencia de otras plataformas complejas todo en uno, Inspector es súper sencillo y compatible con PHP. Puedes probar nuestro paquete Laravel o Symfony.

Si busca una automatización eficaz, conocimientos profundos y la capacidad de reenviar alertas y notificaciones a su entorno de mensajería, pruebe Inspector de forma gratuita. Registre su cuenta.

O obtenga más información en el sitio web: https://inspector.dev

[Resolved] Integrity constraint violation – Fast tips

Declaración de liberación Este artículo se reproduce en: https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3