English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي PostgreSQL

دليل متقدم PostgreSQL

واجهة PostgreSQL

محددات PostgreSQL

تستخدم قيود PostgreSQL لتعريف قواعد البيانات في الجدول.

إذا كان هناك سلوكان مخالفان للقيود، يتم إيقاف السلوك.

يمكن تحديد القيود عند إنشاء الجدول (من خلال جملة CREATE TABLE)، أو بعد إنشاء الجدول (من خلال جملة ALTER TABLE).

تضمن القيود دقة وثبات البيانات في قاعدة البيانات.

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

هذه هي القيود التي يتم استخدامها بشكل شائع في PostgreSQL.

  • NOT NULLيُشير إلى أن العمود لا يمكن أن يحتوي على قيم NULL.

  • UNIQUEيضمن أن تكون القيم في العمود فريدة.

  • PRIMARY Key: مزيج من NOT NULL و UNIQUE. يضمن أن يكون لديك معرف فريد (أو مزيج من عمودين أو أكثر) مما يساعد في العثور على سجل معين في الجدول بشكل أسرع وأسهل.

  • FOREIGN Key: تضمن أن تكون البيانات في جدول معين مطابقة للقيم في جدول آخر، مما يضمن تكامل الإشارة.

  • CHECK: تضمن أن تكون القيم في العمود تتوافق مع الشروط المحددة.

  • EXCLUSION : قيود الاستبعاد، تضمن أن إذا تم مقارنة أي سطرين معينين من الأعمدة أو التعبيرات المحددة باستخدام ملاحق معينة، فإن على الأقل ملاحق واحدة من المقارنات ستعود خاطئة أو قيمة فارغة.

قيود NOT NULL

بافتراض الافتراض، يمكن أن يكون الحقل محفوظاً كقيمة NULL. إذا لم تريد أن يكون لديك NULL في عمود معين، فعليك تعريف هذه القيود في العمود، لتحدد عدم السماح بقيم NULL في هذا العمود.

NULL ليس نفسه لا وجود للبيانات، إنه يمثل بيانات غير معروفة.

示例

في هذا المثال، تم إنشاء جدول جديد يُدعى COMPANY1، تم إضافة 5 مجالات، حيث تم تعيين ثلاثة ID،NAME،AGE لتكون غير تقليدية:

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS           CHAR(50),
   SALARY         REAL
);

قيود UNIQUE

يمكن تعيين قيود UNIQUE لتجعل الأعمدة الفريدة، مما يمنع ظهور قيم مكررة في نفس العمود.

示例

في هذا المثال، تم إنشاء جدول جديد يُدعى COMPANY3، تم إضافة 5 مجالات، حيث تم تعيين AGE كUNIQUE، لذا لا يمكنك إضافة سجلات تحتوي على نفس العمر:

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS           CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY

المفتاح الرئيسي مهم للغاية أثناء تصميم قاعدة البيانات.

PRIMARY KEY تُسمى المفتاح الرئيسي، وهي معرف فريد لكل سجل في جدول البيانات.

يمكن أن يكون هناك عدة أعمدة معينة يمكن تعيين UNIQUE عليها، ولكن جدول واحد فقط يمكن تعيين PRIMARY KEY.

يمكننا استخدام المفتاح الرئيسي لمراجعة سجلات الجدول، أو بتعيين المفتاح الرئيسي كمفتاح خارجي في جدول آخر، لإنشاء علاقات بين الجداول.

المفتاح الرئيسي هو مزيج من قيود عدم الوجود والتميز.

يمكن أن يكون لدي جدول مفتاح رئيسي واحد فقط، ويمكن أن يتكون من مجال واحد أو أكثر، وعندما تكون المجالات متعددة كجزء من المفتاح الرئيسي، تُسمى هذه المفتاح الرئيسي مفتاحاً مركباً.

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

示例

下面我们创建 COMAPNY4 表,其中 ID 作为主键:

CREATE TABLE COMPANY4(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS           CHAR(50),
   SALARY         REAL
);

FOREIGN KEY 约束

FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。

通常一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。

示例

下面示例创建了一张 COMPANY6 表,并添加了5个字段:

CREATE TABLE COMPANY6(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS           CHAR(50),
   SALARY         REAL
);

下面示例创建一张 DEPARTMENT1 表,并添加 3 个字段,EMP_ID 就是外键,参照 COMPANY6 的 ID:

CREATE TABLE DEPARTMENT1(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      references COMPANY6(ID)
);

CHECK 约束

CHECK 约束保证列中的所有值满足某一条件,即对输入一条记录要进行检查。如果条件值为 false,则记录违反了约束,且不能输入到表。

示例

例如,下面示例建一个新的表 COMPANY5,增加了五列。在这里,我们为 SALARY 列添加 CHECK,所以工资不能为零:

CREATE TABLE COMPANY5(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS           CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

EXCLUSION 约束

EXCLUSION 约束确保如果使用指定的运算符在指定列或表达式上比较任意两行,至少其中一个运算符比较将返回 false 或 null。

示例

下面示例创建了一张 COMPANY7 表,添加 5 个字段,并且使用了 EXCLUDE 约束。

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE               INT,
   ADDRESS           CHAR(50),
   SALARY            REAL,
   EXCLUDE USING gist
   (NAME WITH =,    -- إذا كانت NAME متطابقة وAGE مختلفة، لا يسمح بإدراج، وإلا يسمح بإدراج
   AGE WITH <>    -- إذا كان ناتج المقارنة يعود صحيحًا لكل جدول، لا يسمح بإدراج، وإلا يسمح بإدراج
);

في هذا السياق، USING gist هو نوع من بناء وتنفيذ المؤشرات.

يجب عليك تنفيذ الأمر CREATE EXTENSION btree_gist مرة واحدة لكل قاعدة بيانات، مما يثبت تثبيت توسعة btree_gist، التي تعرف القيود EXCLUDE على أنواع البيانات الكميّة النقية.

بما أننا قد أجبرنا على أن يكون العمر متطابقًا، دعنا نرى ذلك من خلال إدراج سجلات في الجدول:

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00);  
-- NAME لهذا البيان مشابه للسطر الأول، وAGE مشابه للسطر الأول أيضًا، لذا يرضي شرط الإدراج
INSERT INTO COMPANY7 VALUES(3, 'Allen', 42, 'California', 20000.00);
-- هذه البيانات مشابهة للبيانات السابقة في NAME، ولكن AGE مختلف، لذا لا يمكن إدخالها

السطور الاثنتين الأولى تم إضافة COMPANY7 بنجاح، ولكن السطر الثالث سيكون لديه خطأ:

ERROR:    duplicate key value violates unique constraint "company7_pkey"
DETAIL:    Key (id)=(3) already exists.

إزالة القيود

لإزالة القيود يجب معرفة اسم القيود، وإذا كنت تعرف الاسم يمكنك إزالة القيود بسهولة، وإذا لم تعرف الاسم،则需要 العثور على الاسم المولد من النظام، باستخدام \d table_name يمكنك العثور على هذه المعلومات.

القواعد العامة كالتالي:

ALTER TABLE table_name DROP CONSTRAINT some_name;