المفتاح الأساسي والمفتاح الخارجي في 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;

إذا كتبت عبارة إدراج، ولم تحدد أي قيمة لهذا العمود، فسيكون للعمود القيمة 0.

SQLite القيد الفريد

SQLite قيد فريد سيمنع القيم المكررة بين كافة قيم العمود.

فمثلا:

EmployeeId INTEGER NOT NULL UNIQUE;

وهذا سوف يفرض "هوية الموظف" أن تكون القيمة فريدة، ولن يُسمح بأي قيم مكررة. لاحظ أن هذا ينطبق على قيم العمود "هوية الموظف" فقط.

SQLite التحقق من القيد

SQLite تحقق من القيد شرطًا للتحقق من القيمة المُدرجة، إذا كانت القيمة لا تتطابق مع الشرط، فلن يتم إدراجها.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

لا يمكنك إدراج قيمة أقل من 10 في "كمية" العمود.

SQLite مفتاح غريب

تشير SQLite المفتاح الخارجي هو قيد يتحقق من وجود قيمة موجودة في جدول ما إلى جدول آخر له علاقة بالجدول الأول الذي تم فيه تعريف المفتاح الخارجي.

أثناء العمل مع جداول متعددة، عندما يكون هناك جدولان مرتبطان ببعضهما البعض مع وجود عمود واحد مشترك. وإذا كنت تريد التأكد من أن القيمة المدرجة في أحدهما يجب أن تكون موجودة في عمود الجدول الآخر، فيجب عليك استخدام "قيد المفتاح الخارجي" في العمود المشترك.

في هذه الحالة، عند محاولة إدراج قيمة في هذا العمود، سيضمن المفتاح الخارجي وجود القيمة المدرجة في عمود الجدول.

لاحظ أن قيود المفاتيح الخارجية غير ممكّنة افتراضيًا SQLite، يجب عليك تمكينها أولاً عن طريق تشغيل الأمر التالي:

PRAGMA foreign_keys = ON;

تم تقديم قيود المفاتيح الخارجية في SQLite بدءًا من الإصدار 3.6.19.

مثال SQLite مفتاح غريب

لنفترض أنه إذا كان لدينا جدولين؛ الطلاب والأقسام.

يحتوي جدول الطلاب على قائمة بالطلاب، ويحتوي جدول الأقسام على قائمة بالأقسام. كل طالب ينتمي إلى القسم. أي أن كل طالب لديه عمود معرف القسم.

الآن، سنرى كيف يمكن أن يكون قيد المفتاح الخارجي مفيدًا للتأكد من أن قيمة معرف القسم في جدول الطلاب يجب أن تكون موجودة في جدول الأقسام.

SQLite مفتاح غريب

لذلك، إذا أنشأنا قيد مفتاح خارجي على معرف القسم في جدول الطلاب، فيجب أن يظهر كل معرف قسم مدرج في جدول الأقسام.

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)
);

للتحقق من كيفية منع قيود المفتاح الخارجي لإدراج عنصر أو قيمة غير محددة في جدول له علاقة بجدول آخر، سننظر في المثال التالي.

في هذا المثال، يحتوي جدول الأقسام على قيد مفتاح خارجي لجدول الطلاب، لذلك يجب أن تكون أي قيمة معرف القسم المدرجة في جدول الطلاب موجودة في جدول الأقسام. إذا حاولت إدراج قيمة معرف القسم غير الموجودة في جدول الأقسام، فسيمنعك قيد المفتاح الخارجي من القيام بذلك.

دعونا ندرج قسمين "تكنولوجيا المعلومات" "الفنون" إلى جدول الأقسام على النحو التالي:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

يجب أن تقوم العبارتان بإدراج قسمين في جدول الأقسام، ويمكنك التأكد من إدراج القيمتين عن طريق تشغيل الاستعلام "اختر * من الأقسام" بعد ذلك:

SQLite مفتاح غريب

ثم حاول إدراج طالب جديد بمعرف قسم غير موجود في جدول الأقسام:

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

لن يتم إدراج الصف، وسوف تحصل على خطأ يفيد بما يلي: فشل قيد المفتاح الخارجي.