Jika anda menghadapi ralat: "Pelanggaran kekangan integriti: Tidak boleh menambah atau mengemas kini baris anak: kekangan kunci asing gagal", anda berada dalam artikel yang betul.
Biasanya anda menghadapi ralat ini apabila anda menambah lajur baharu pada jadual dan mengisytiharkannya sebagai Kunci Asing.
Dalam pangkalan data SQL, kunci asing ialah medan dalam jadual yang digunakan untuk mewujudkan pautan antara data dalam jadual lain. Pertimbangkan jadual pelanggan di bawah.
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) );
Kini anda mahu memautkan pelanggan anda kepada kumpulan. Mula-mula anda perlu menambah lajur baharu pada jadual pelanggan yang mengandungi rujukan kepada jadual kumpulan:
# Create the new column "group_id" ALTER TABLE customers ADD COLUMN group_id INT NOT NULL;
Anda boleh menambah kekangan kunci asing untuk mengaktifkan hubungan dengan jadual kumpulan:
# Add the FK constraints ALTER TABLE customers ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES customers(id);
Apabila anda menjalankan operasi ubah ini pada jadual pelanggan, pangkalan data akan mengesahkan bahawa ID dalam medan group_id wujud dalam jadual kumpulan.
Semasa semakan ini pangkalan data akan menimbulkan "Ralat pelanggaran integriti" kerana lajur group_id masih kosong, jadi ia tidak mengandungi sebarang rujukan yang sah dalam jadual kumpulan. Jadi enjin SQL gagal cuba menggunakan kekangan kunci asing. Ini kerana nilai kosong bukan kunci asing yang sah kepada jadual kumpulan.
Tindakan paling mudah ialah mengisytiharkan lajur baharu sebagai boleh dibatalkan.
Anda boleh mengalih keluar arahan "NOT NULL" daripada pertanyaan alter untuk membenarkan lajur group_id mengandungi nilai nol.
Perubahan mudah ini akan menyelesaikan masalah itu sejak awal, kerana kini kunci asing juga boleh menjadi batal. Anda boleh menjalankan migrasi data untuk mengisi lajur group_id baharu dalam jadual pelanggan dan merancang keluaran baharu untuk memperkenalkan semula kekangan "NOT NULL".
Jika dalam aplikasi anda Pelanggan tidak boleh wujud tanpa Kumpulan tertentu, anda harus ingat bahawa mempunyai group_id boleh batal, pangkalan data anda tidak mengetahui kekangan ini.
Jika anda membuat kesilapan semasa penciptaan entiti dalam aplikasi anda, pangkalan data tidak akan memaklumkan anda.
Penyelesaian lain ialah menambah kerja pemindahan data antara pertanyaan alter untuk menambah lajur baharu dan untuk menambah kunci asing.
Setelah anda mempunyai lajur group_id baharu dalam jadual pelanggan, anda boleh menjalankan skrip untuk mengisi lajur ini bagi baris sedia ada dengan ID yang sah daripada jadual kumpulan.
Ini adalah contoh pertanyaan untuk melaksanakan tugas ini:
UPDATE customers, groups SET customers.group_id = groups.id Where customers.user_id = groups.user_id;
Dalam aplikasi moden semua tugas ini dilakukan menggunakan alat migrasi. Ia biasanya tersedia dalam kebanyakan rangka kerja pembangunan aplikasi biasa.
Dalam contoh di bawah, saya akan menunjukkan kepada anda cara menangani isu pelanggaran kekangan Integriti menggunakan migrasi Laravel.
Buat penghijrahan:
php artisan make:migration add_goup_id_fk_to_customers –table=customers
Anda boleh memecahkan penghijrahan dalam dua bahagian seperti yang ditunjukkan di bawah:
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'); }); } };
Jika anda berminat untuk meningkatkan prestasi pangkalan data, anda boleh lihat artikel di bawah tentang "Pertanyaan Pangkalan Data Pintar":
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/
Inspektor ialah alat Pemantauan Pelaksanaan Kod yang direka khusus untuk pembangun perisian. Anda tidak perlu memasang apa-apa di peringkat pelayan, cuma pasangpakej komposerdan anda sudah bersedia untuk pergi.
Tidak seperti platform lain yang kompleks, semua-dalam-satu, Inspektor sangat mudah dan mesra PHP. Anda boleh mencuba pakej Laravel atau Symfony kami.
Jika anda mencari automasi yang berkesan, cerapan mendalam dan keupayaan untuk memajukan makluman dan pemberitahuan ke dalam persekitaran pemesejan anda cuba Inspektor secara percuma. Daftar akaun anda.
Atau ketahui lebih lanjut di tapak web: https://inspector.dev
Atas ialah kandungan terperinci [Diselesaikan] Pelanggaran kekangan integriti – Petua pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!