ก่อนอื่นฉันสร้างตารางเช่น
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
แล้วแทรกค่าในตารางนั้น
INSERT INTO Customer values ('-2','abc','zz');
MySQL ไม่แสดงข้อผิดพลาด แต่ยอมรับค่า
ก่อนอื่นฉันสร้างตารางเช่น
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
แล้วแทรกค่าในตารางนั้น
INSERT INTO Customer values ('-2','abc','zz');
MySQL ไม่แสดงข้อผิดพลาด แต่ยอมรับค่า
คำตอบ:
MySQL 8.0.16เป็นเวอร์ชันแรกที่รองรับข้อ จำกัด ในการตรวจสอบ
อ่านhttps://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
หากคุณใช้ MySQL 8.0.15 ขึ้นไปไฟล์ คู่มืออ้างอิง MySQL จะระบุว่า:
CHECK
ประโยคจะแยกกัน แต่ปฏิเสธโดยทุกเครื่องมือการจัดเก็บข้อมูล
ลองไก ...
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 ;
หวังว่าจะช่วยได้
CHECK
ข้อ จำกัด ที่กำหนดไว้
ขออภัย MySQL ไม่รองรับข้อ จำกัด ในการตรวจสอบ SQL คุณสามารถกำหนดได้ในแบบสอบถาม DDL ของคุณด้วยเหตุผลด้านความเข้ากันได้ แต่จะถูกละเว้น
มีทางเลือกง่ายๆ
คุณสามารถสร้างBEFORE INSERT
และBEFORE UPDATE
ทริกเกอร์ซึ่งทำให้เกิดข้อผิดพลาดหรือตั้งค่าฟิลด์เป็นค่าเริ่มต้นเมื่อไม่ตรงตามข้อกำหนดของข้อมูล
ตัวอย่างการBEFORE INSERT
ทำงานหลังจาก MySQL 5.5
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
IF CHAR_LENGTH( NEW.ID ) < 4 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
END IF;
END$$
DELIMITER ;
ก่อนหน้า MySQL 5.5 คุณต้องทำให้เกิดข้อผิดพลาดเช่นเรียกขั้นตอนที่ไม่ได้กำหนด
ในทั้งสองกรณีนี้ทำให้เกิดการย้อนกลับธุรกรรมโดยปริยาย MySQL ไม่อนุญาตให้ใช้คำสั่ง ROLLBACK ภายในโพรซีเดอร์และทริกเกอร์
หากคุณไม่ต้องการย้อนกลับธุรกรรม (INSERT / UPDATE ควรผ่านแม้ว่าจะมี "ข้อ จำกัด ในการตรวจสอบ" ที่ล้มเหลวคุณสามารถเขียนทับค่าโดยใช้SET NEW.ID = NULL
ซึ่งจะตั้งค่ารหัสเป็นค่าเริ่มต้นของฟิลด์ซึ่งไม่สมเหตุสมผลสำหรับ id สรรพสินค้าใหญ่
แก้ไข: ลบคำพูดที่หลงผิด
เกี่ยวกับตัว:=
ดำเนินการ:
ต่างจาก
=
ตัว:=
ดำเนินการจะไม่ถูกตีความว่าเป็นตัวดำเนินการเปรียบเทียบ ซึ่งหมายความว่าคุณสามารถใช้:=
ในคำสั่ง SQL ที่ถูกต้อง (ไม่ใช่เฉพาะในคำสั่ง SET) เพื่อกำหนดค่าให้กับตัวแปร
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
เกี่ยวกับคำพูดของตัวระบุ backtick:
อักขระเครื่องหมายคำพูดของตัวระบุคือ backtick (“ `”)
หากเปิดใช้งานโหมด ANSI_QUOTES SQL จะอนุญาตให้อ้างตัวระบุภายในเครื่องหมายคำพูดคู่
DELIMITER
?
CHECK
ข้อ จำกัด ถูกละเว้นโดย MySQL ตามที่อธิบายไว้ในความคิดเห็นย่อส่วนในเอกสาร: CREATE TABLE
CHECK
ประโยคจะแยกกัน แต่ปฏิเสธโดยทุกเครื่องมือการจัดเก็บข้อมูล
CHECK
ข้อ จำกัด อย่างถูกต้องหากการCHECK
ประเมินเป็นไปตามFALSE
นั้นการแทรก (หรือการอัปเดต) จะไม่เสร็จสิ้นและเกิดข้อผิดพลาด
CHECK
จำกัด ดูเหมือนจะไม่ได้รับการดำเนินการใน MySQL
ดูรายงานข้อบกพร่องนี้: https://bugs.mysql.com/bug.php?id=3464
ดังที่กล่าวโดย joanq MariaDB ดูเหมือนว่าจะรองรับข้อ จำกัด CHECK ท่ามกลางสินค้าอื่น ๆ :
"รองรับ CHECK CONSTRAINT ( MDEV-7563 )"
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
ตรวจสอบข้อ จำกัด ได้รับการสนับสนุนตั้งแต่เวอร์ชัน 8.0.15 (ยังไม่ได้เปิดตัว)
https://bugs.mysql.com/bug.php?id=3464
[23 ม.ค. 16:24 น.] Paul Dubois
โพสต์โดยผู้พัฒนา: แก้ไขใน 8.0.15
ก่อนหน้านี้ MySQL อนุญาตรูปแบบที่ จำกัด ของไวยากรณ์ CHECK ข้อ จำกัด แต่แยกวิเคราะห์และเพิกเฉย ขณะนี้ MySQL ใช้คุณสมบัติหลักของข้อ จำกัด ในการตรวจสอบตารางและคอลัมน์สำหรับเอ็นจิ้นการจัดเก็บทั้งหมด มีการกำหนดข้อ จำกัด โดยใช้คำสั่ง CREATE TABLE และ ALTER TABLE
อัปเดตเป็น MySQL 8.0.16 เพื่อใช้checks
:
ตั้งแต่ MySQL 8.0.16 CREATE TABLE อนุญาตให้ใช้คุณสมบัติหลักของข้อ จำกัด การตรวจสอบตารางและคอลัมน์สำหรับเอ็นจิ้นหน่วยเก็บข้อมูลทั้งหมด CREATE TABLE อนุญาตให้ใช้ไวยากรณ์ข้อ จำกัด CHECK ต่อไปนี้สำหรับทั้งข้อ จำกัด ของตารางและข้อ จำกัด ของคอลัมน์
ลองด้วยset sql_mode = 'STRICT_TRANS_TABLES'
ORSET sql_mode='STRICT_ALL_TABLES'
CHECK
ข้อ จำกัด