คีย์หลักและคีย์ต่างประเทศเข้า 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

ตอนนี้ เราจะดูว่าข้อจำกัดของคีย์ต่างประเทศมีประโยชน์อย่างไรเพื่อให้แน่ใจว่าค่าของรหัสแผนกในตารางนักเรียนจะต้องมีอยู่ในตารางแผนก

SQLite ต่างประเทศที่สำคัญ

ดังนั้น ถ้าเราสร้างข้อจำกัดคีย์ต่างประเทศบน 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');

คำสั่งทั้งสองควรแทรกสองแผนกลงในตารางแผนก คุณสามารถมั่นใจได้ว่าทั้งสองค่าถูกแทรกโดยการเรียกใช้แบบสอบถาม “เลือก * จากแผนก” หลังจากนั้น:

SQLite ต่างประเทศที่สำคัญ

จากนั้นลองแทรกนักเรียนใหม่ด้วย departmentId ที่ไม่มีอยู่ในตารางแผนก:

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

แถวจะไม่ถูกแทรก และคุณจะได้รับข้อผิดพลาดแจ้งว่า: ข้อจำกัดของคีย์ต่างประเทศล้มเหลว

สรุปโพสต์นี้ด้วย: