คีย์หลักและคีย์ต่างประเทศเข้า SQLite ด้วยตัวอย่าง
SQLite ข้อ จำกัด
ข้อจำกัดของคอลัมน์บังคับใช้ข้อจำกัดและกฎกับค่าที่แทรกในคอลัมน์เพื่อตรวจสอบความถูกต้องของข้อมูลที่แทรก ข้อจำกัดของคอลัมน์ถูกกำหนดไว้เมื่อสร้างตารางในคำจำกัดความของคอลัมน์
SQLite คีย์หลัก
ค่าทั้งหมดในคอลัมน์คีย์หลักต้องไม่ซ้ำกันและไม่เป็นค่าว่าง
คีย์หลักสามารถใช้ได้กับคอลัมน์เดียวเท่านั้นหรือใช้กับคอลัมน์รวมกันได้ ในกรณีหลัง ค่าผสมของคอลัมน์ไม่ควรซ้ำกันสำหรับแถวของตารางทั้งหมด
ไวยากรณ์:
มีหลายวิธีในการกำหนดคีย์หลักบนตาราง เช่น:
- ในคำจำกัดความของคอลัมน์เอง:
ColumnName INTEGER NOT NULL PRIMARY KEY;
- เป็นคำจำกัดความแยกต่างหาก:
PRIMARY KEY(ColumnName);
- หากต้องการสร้างการรวมคอลัมน์เป็นคีย์หลัก:
PRIMARY KEY(ColumnName1, ColumnName2);
ไม่ใช่ข้อจำกัดที่เป็นโมฆะ
SQLite ไม่ใช่ข้อจำกัดที่เป็นโมฆะจะป้องกันไม่ให้คอลัมน์มีค่าเป็นโมฆะ:
ColumnName INTEGER NOT NULL;
ข้อจำกัดเริ่มต้น
SQLite ข้อจำกัดเริ่มต้น หากคุณไม่ใส่ค่าใดๆ ในคอลัมน์ ระบบจะแทรกค่าเริ่มต้นแทน
ตัวอย่างเช่น:
ColumnName INTEGER DEFAULT 0;
หากคุณเขียนคำสั่ง insert และคุณไม่ได้ระบุค่าใดๆ สำหรับคอลัมน์นั้น คอลัมน์จะมีค่าเป็น 0
SQLite ข้อจำกัดที่ไม่ซ้ำใคร
SQLite ข้อจำกัดที่ไม่ซ้ำจะป้องกันค่าที่ซ้ำกันระหว่างค่าทั้งหมดของคอลัมน์
ตัวอย่างเช่น:
EmployeeId INTEGER NOT NULL UNIQUE;
ซึ่งจะเป็นการบังคับใช้ “รหัสพนักงาน” ค่าต้องไม่ซ้ำกัน ไม่อนุญาตให้มีค่าซ้ำกัน โปรดทราบว่าสิ่งนี้ใช้กับค่าของคอลัมน์ “รหัสพนักงาน” เท่านั้น
SQLite ตรวจสอบข้อจำกัด
SQLite ตรวจสอบเงื่อนไขจำกัดเพื่อตรวจสอบค่าที่แทรก หากค่าไม่ตรงกับเงื่อนไขก็จะไม่ถูกแทรก
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
คุณไม่สามารถแทรกค่าที่น้อยกว่า 10 ใน "ปริมาณ" คอลัมน์.
SQLite ต่างประเทศที่สำคัญ
การขอ SQLite Foreign Key เป็นข้อจำกัดที่ตรวจสอบการมีอยู่ของค่าที่มีอยู่ในตารางหนึ่งไปยังอีกตารางหนึ่งซึ่งสัมพันธ์กับตารางแรกที่มีการกำหนด Foreign Key
ในขณะที่ทำงานกับหลายตาราง เมื่อมีสองตารางที่เกี่ยวข้องกันโดยมีคอลัมน์เดียวเหมือนกัน และหากคุณต้องการให้แน่ใจว่าค่าที่แทรกในค่าใดค่าหนึ่งต้องมีอยู่ในคอลัมน์ของอีกตารางหนึ่ง คุณควรใช้ "Foreign key Constraint" ในคอลัมน์ที่มีเหมือนกัน
ในกรณีนี้ เมื่อคุณพยายามแทรกค่าในคอลัมน์นั้น Foreign Key จะทำให้แน่ใจว่าค่าที่แทรกนั้นมีอยู่ในคอลัมน์ของตาราง
โปรดทราบว่าข้อจำกัดของคีย์ต่างประเทศไม่ได้เปิดใช้งานตามค่าเริ่มต้นใน SQLiteคุณต้องเปิดใช้งานก่อนโดยรันคำสั่งต่อไปนี้:
PRAGMA foreign_keys = ON;
มีการนำข้อจำกัดคีย์ต่างประเทศมาใช้ SQLite เริ่มตั้งแต่เวอร์ชัน 3.6.19
ตัวอย่างของการ SQLite ต่างประเทศที่สำคัญ
สมมติว่าเรามีสองตาราง นักศึกษาและหน่วยงาน
ตารางนักเรียนมีรายชื่อนักเรียน และตารางแผนกมีรายชื่อแผนกต่างๆ นักเรียนแต่ละคนอยู่ในแผนก กล่าวคือ นักเรียนแต่ละคนจะมีคอลัมน์ departmentId
ตอนนี้ เราจะดูว่าข้อจำกัดของคีย์ต่างประเทศมีประโยชน์อย่างไรเพื่อให้แน่ใจว่าค่าของรหัสแผนกในตารางนักเรียนจะต้องมีอยู่ในตารางแผนก
ดังนั้น ถ้าเราสร้างข้อจำกัดคีย์ต่างประเทศบน DepartmentId บนตาราง Students แต่ละ departmentId ที่แทรกไว้จะต้องนำเสนอในตาราง Departments
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [DepartmentName] NVARCHAR(50) NULL ); CREATE TABLE [Students] ( [StudentId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [StudentName] NVARCHAR(50) NULL, [DepartmentId] INTEGER NOT NULL, [DateOfBirth] DATE NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) );
ในการตรวจสอบว่าข้อจำกัดคีย์ต่างประเทศสามารถป้องกันไม่ให้มีการแทรกองค์ประกอบหรือค่าที่ไม่ได้กำหนดลงในตารางที่มีความสัมพันธ์กับตารางอื่นได้อย่างไร เราจะดูตัวอย่างต่อไปนี้
ในตัวอย่างนี้ ตาราง Departments มีข้อจำกัดคีย์ Foreign ในตาราง Students ดังนั้นค่า departmentId ใดๆ ที่แทรกในตารางนักเรียนจะต้องมีอยู่ในตารางแผนก หากคุณพยายามแทรกค่า departmentId ที่ไม่มีอยู่ในตารางแผนก ข้อจำกัดของคีย์ต่างประเทศจะป้องกันไม่ให้คุณทำเช่นนั้น
มาแทรกสองแผนกกัน "มัน" และ “ศิลปะ” ลงในตารางแผนกดังต่อไปนี้:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
คำสั่งทั้งสองควรแทรกสองแผนกลงในตารางแผนก คุณสามารถมั่นใจได้ว่าทั้งสองค่าถูกแทรกโดยการเรียกใช้แบบสอบถาม “เลือก * จากแผนก” หลังจากนั้น:
จากนั้นลองแทรกนักเรียนใหม่ด้วย departmentId ที่ไม่มีอยู่ในตารางแผนก:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
แถวจะไม่ถูกแทรก และคุณจะได้รับข้อผิดพลาดแจ้งว่า: ข้อจำกัดของคีย์ต่างประเทศล้มเหลว


