Rumah > pangkalan data > tutorial mysql > Mengapa Kekangan CHECK MySQL Gagal dalam Versi Sebelum 8.0.16?

Mengapa Kekangan CHECK MySQL Gagal dalam Versi Sebelum 8.0.16?

Patricia Arquette
Lepaskan: 2025-01-10 10:43:43
asal
313 orang telah melayarinya

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

masalah kegagalan kekangan MySQL CHECK

Apabila mentakrifkan jadual pangkalan data, adalah penting untuk menambah kekangan untuk memastikan integriti data. Kekangan CHECK membolehkan anda menentukan syarat yang mesti dipenuhi oleh nilai lajur tertentu. Walau bagaimanapun, dalam MySQL 8.0.15 dan lebih awal, kekangan CHECK tidak dikuatkuasakan, yang merupakan kes khas.

Contoh:

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>
Salin selepas log masuk

Selepas membuat jadual ini, cuba masukkan baris dengan nilai SD negatif:

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>
Salin selepas log masuk

MySQL tidak akan melaporkan ralat, walaupun nilai yang dimasukkan melanggar kekangan CHECK yang ditentukan. Ini kerana menurut Manual Rujukan MySQL:

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>
Salin selepas log masuk

Penyelesaian:

Untuk menyelesaikan isu ini, anda boleh melakukan salah satu daripada yang berikut:

  • Naik taraf kepada MySQL 8.0.16 atau lebih tinggi: Versi ini mula menyokong kekangan CHECK. Lihat dokumentasi MySQL untuk butiran lanjut.
  • Laksanakan pencetus: Pencetus boleh digunakan untuk memaksa kekangan yang diabaikan oleh enjin storan. Mencipta pencetus yang menyemak nilai SD sebelum memasukkan, seperti yang ditunjukkan di bawah, boleh menguatkuasakan kekangan dengan berkesan:
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>
Salin selepas log masuk

Sila ambil perhatian bahawa contoh pencetus di atas menetapkan nilai SD nombor negatif kepada 0, anda boleh mengubah suai logik pencetus mengikut keperluan sebenar anda.

Atas ialah kandungan terperinci Mengapa Kekangan CHECK MySQL Gagal dalam Versi Sebelum 8.0.16?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan