«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > [Решено] Нарушение ограничения целостности – быстрые советы

[Решено] Нарушение ограничения целостности – быстрые советы

Опубликовано 25 августа 2024 г.
Просматривать:461

Если вы столкнулись с ошибкой: «Нарушение ограничения целостности: невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа», вы попали в правильную статью.

Обычно вы сталкиваетесь с этой ошибкой, когда добавляете новый столбец в таблицу и объявляете его как внешний ключ.

В базе данных SQL внешний ключ — это поле в таблице, используемое для установления связи между данными в другой таблице. Рассмотрим таблицу клиентов ниже.

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

Теперь вы хотите связать своих клиентов с группой. Сначала вам следует добавить в таблицу клиентов новый столбец, содержащий ссылку на таблицу групп:

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

Тогда вы можете добавить ограничение внешнего ключа, чтобы активировать связь с таблицей групп:

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

Когда вы запускаете эту операцию изменения в таблице клиентов, база данных проверит, существует ли идентификатор в поле group_id в таблице групп.

Во время этой проверки база данных выдаст сообщение «Ошибка нарушения целостности», поскольку столбец group_id все еще пуст и не содержит действительных ссылок в таблице групп. Таким образом, механизму SQL не удается применить ограничение внешнего ключа. Это потому, что пустое значение не является действительным внешним ключом таблицы групп.

Как устранить ошибку «Нарушение целостности»

Самое простое действие — объявить новый столбец допускающим значение NULL.

Вы можете удалить инструкцию «NOT NULL» из запроса на изменение, чтобы столбец group_id мог содержать нулевые значения.

Это простое изменение в первую очередь решит проблему, поскольку теперь внешний ключ тоже может иметь значение null. Вы можете запустить миграцию данных, чтобы в конечном итоге заполнить новый столбец group_id в таблице клиентов, и запланировать новый выпуск, чтобы снова ввести ограничение «NOT NULL».

Если в вашем приложении Клиент не может существовать без определенной группы, вы должны помнить, что, если group_id имеет значение NULL, ваша база данных не знает об этом ограничении.

Если вы допустите ошибку при создании сущности в своем приложении, база данных не предупредит вас.

Миграция данных

Другое решение — добавить задание переноса данных между запросом на изменение для добавления нового столбца и запросом на добавление внешнего ключа.

После того как у вас появится новый столбец group_id в таблице клиентов, вы можете запустить сценарий, чтобы заполнить этот столбец для существующих строк действительным идентификатором из таблицы групп.

Это пример запроса для выполнения этой задачи:

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

Использование миграции Laravel

В современных приложениях все эти задачи выполняются с помощью инструмента миграции. Обычно он доступен в большинстве распространенных платформ разработки приложений.

В примере ниже я покажу вам, как решить проблему нарушения ограничений целостности с помощью миграции Laravel.

Создайте миграцию:

php artisan make:migration add_goup_id_fk_to_customers –table=customers

Миграцию можно разделить на две части, как показано ниже:

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

Если вы заинтересованы в повышении производительности базы данных, вы можете прочитать статью «Умные запросы к базе данных» ниже:
https://inspector.dev/how-to-accelerate-application- Performance-with-smart-sql-queries/

Впервые в инспекторе? Контролируйте свое приложение бесплатно

Инспектор — это инструмент мониторинга выполнения кода, специально разработанный для разработчиков программного обеспечения. Вам не нужно ничего устанавливать на уровне сервера, просто установите пакет композитора и все готово.

В отличие от других сложных универсальных платформ, Inspector очень прост и дружелюбен к PHP. Вы можете попробовать наш пакет Laravel или Symfony.

Если вам нужна эффективная автоматизация, глубокая аналитика и возможность пересылать оповещения и уведомления в вашу среду обмена сообщениями, попробуйте Inspector бесплатно. Зарегистрируйте свой аккаунт.

Или узнайте больше на сайте: https://inspector.dev

[Resolved] Integrity constraint violation – Fast tips

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3