المفتاح الأساسي والمفتاح الخارجي في SQLite مع أمثلة

قيود سكليتي

تفرض قيود الأعمدة قيودًا وقواعد على القيم المدرجة في عمود للتحقق من صحة البيانات المدرجة. يتم تعريف قيود الأعمدة عند إنشاء جدول، في تعريف العمود.

مفتاح SQLite الأساسي

يجب أن تكون كافة القيم الموجودة في عمود المفتاح الأساسي فريدة وليست فارغة

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

بناء الجملة:

هناك العديد من الطرق المختلفة لتحديد المفتاح الأساسي في الجدول مثل:

  • في تعريف العمود نفسه:
    ColumnName INTEGER NOT NULL PRIMARY KEY;
  • كتعريف منفصل:
    PRIMARY KEY(ColumnName);
  • لإنشاء مجموعة من الأعمدة كمفتاح أساسي:
    PRIMARY KEY(ColumnName1, ColumnName2);

ليس القيد فارغة

يمنع قيد SQLite Not null العمود من الحصول على قيمة فارغة:

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 قيدًا يتحقق من وجود قيمة موجودة في جدول ما إلى جدول آخر له علاقة بالجدول الأول الذي تم فيه تعريف المفتاح الخارجي.

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

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

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

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

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

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

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

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

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

المفتاح الخارجي لـ SQLite

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

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

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