[Diselesaikan] Pelanggaran kekangan integriti – Petua pantas

WBOY
Lepaskan: 2024-08-17 22:50:09
asal
885 orang telah melayarinya

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) );
Salin selepas log masuk

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;
Salin selepas log masuk

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);
Salin selepas log masuk

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.

Bagaimana untuk menyelesaikan ralat pelanggaran Integriti

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.

Penghijrahan data

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;
Salin selepas log masuk

Menggunakan Migrasi Laravel

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
Salin selepas log masuk

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'); }); } };
Salin selepas log masuk

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/

Baru Kepada Inspektor? Pantau aplikasi anda secara percuma

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

[Resolved] Integrity constraint violation – Fast tips

Atas ialah kandungan terperinci [Diselesaikan] Pelanggaran kekangan integriti – Petua pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!