Если вы столкнулись с ошибкой: «Нарушение ограничения целостности: невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа», вы попали в правильную статью.
Обычно вы сталкиваетесь с этой ошибкой, когда добавляете новый столбец в таблицу и объявляете его как внешний ключ.
В базе данных 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.
Создайте миграцию:
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
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3