انواع constraint ها: CHECK و DEFAULT و INDEX

17 فروردین 1398
درسنامه درس 25 از سری آموزش زبان SQL
SQL-INDEX-CHECK-DEFAULT-Constraints

با سلام و احترام خدمت شما خوانندگان گرامی، در این قسمت می خواهیم constraint هایی به نام های CHECK و DEFAULT و INDEX را بررسی کنیم. این ها آخرین constraint هایی هستند که در زبان SQL وجود دارند.

CHECK

این محدودیت، اندازه ی مقداری را تعیین می کند که ما در ستون یک جدول قرار می دهیم. شما می توانید این محدودیت را روی یک ستون یا تمام ستون های جدول خود اعمال کنید. بگذارید نمونه ای از این محدودیت را به شما نشان دهم. در مثال زیر می خواهیم برای ستون Age (به معنی «سن») در جدول Persons محدودیتی تعیین کنیم که می گوید این ستون نمی تواند مقادیر زیر 18 را قبول کند (افراد نباید زیر 18 سال باشند):

برای MySQL:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    CHECK (Age>=18)
);

برای SQL Server یا Oracle یا MS Access:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int CHECK (Age>=18)
);

اگر می خواهید CHECK روی چندین جدول اعمال شود از ساختار زیر برای تمام پایگاه های داده استفاده کنید:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    City varchar(255),
    CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
);

جدول های از پیش تعریف شده

تا اینجا کار این مثال ها برای ساخت جدول با محدودیت خاصی بود اما اگر می خواهید جدولی را که از قبل ساخته اید به این شکل ویرایش کنید باید به شکل زیر عمل کنید.

فرض کنید می خواهیم همان ستون Age را در جدولی از پیش تعریف شده تغییر دهیم:

برای MySQL یا SQL Server یا Oracle یا MS Access:

ALTER TABLE Persons
ADD CHECK (Age>=18);

و برای اعمال روی چندین ستون مختلف:

ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');

حذف CHECK

برای حذف این محدودیت باید از ساختار زیر استفاده کنید.

برای SQL Server یا Oracle یا MS Access:

ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;

برای MySQL:

ALTER TABLE Persons
DROP CHECK CHK_PersonAge;

DEFAULT

DEFAULT باعث می شود ستون های جدول شما مقدار پیش فرضی داشته باشند بنابراین اگر هیچ مقداری به فیلد خاصی داده نشود، مقدار DEFAULT در آن خانه می نشیند. فرض کنید می خواهیم برای ستون City در جدول Persons مقدار پیش فرض تعیین کنیم. در این صورت:

برای My SQL یا SQL Server یا Oracle یا MS Access:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    City varchar(255) DEFAULT 'Sandnes'
);

از دیگر استفاده های DEFAULT این است که می تواند مقادیر سیستمی مانند تاریخ را با استفاده از توابعی مانند ()GETDATE وارد جدول شما کند:

CREATE TABLE Orders (
    ID int NOT NULL,
    OrderNumber int NOT NULL,
    OrderDate date DEFAULT GETDATE()
);

بنابراین می توانید به صورت خودکار زمان ثبت نام کاربر، زمان آپلود یک فایل و ... را تعیین کنید بدون اینکه نیاز باشد دخالتی در عملیات ثبت آن داشته باشید.

جدول های از پیش تعریف شده

اگر جدول خود را از قبل ساخته اید و حالا می خواهید به آن مقدار پیش فرض بدهید باید از ساختار زیر استفاده کنید. به طور مثال می خواهم برای همان ستون City مقدار پیش فرض تعیین کنم:

برای MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';

برای SQL Server:

ALTER TABLE Persons
ADD CONSTRAINT df_City 
DEFAULT 'Sandnes' FOR City;

برای MS Access:

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';

برای Oracle:

ALTER TABLE Persons
MODIFY City DEFAULT 'Sandnes';

حذف DEFAULT

اگر از قبل برای جدول خود DEFAULT تعریف کرده اید اما دیگر نیازی به آن ندارید می توانید از ساختار زیر برای حذف آن استفاده کنید:

برای MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT;

برای SQL Server یا Oracle یا MS Access:

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;

CREATE INDEX

همانطور که از نام این دستور مشخص است کارش ساختن index برای جدول های پایگاه داده است. استفاده ی index ها در پایگاه داده این است که می توانیم با استفاده از آن ها داده ها را بسیار سریع تر دریافت کنیم. البته واضح است که index برای کاربران قابل مشاهده نیست.

هشدار: بروزرسانی (update) جدولی که index داشته باشد بیشتر از جدولی که بدون index باشد طول می کشد. چرا؟ به دلیل اینکه index ها نیز باید آپدیت شوند بنابراین کارها تقریبا دو برابر می شود. به همین خاطر پیشنهاد می شود فقط در ستون هایی از index استفاده کنید که مرتبا مورد استفاده قرار می گیرند.

برای ایجاد index روی ستون خاصی از جدول باید طبق ساختار زیر عمل کنید:

CREATE INDEX index_name
ON table_name (column1, column2, ...);

در این ساختار مقادیر تکراری نیز مورد قبول هستند. اگر دوست دارید مقادیر غیر تکراری و منحصر به فرد داشته باشید از ساختار زیر استفاده کنید:

CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

هشدار: دستور ساختن index برای پایگاه داده های مختلف، متفاوت است بنابراین قبل از استفاده حتما دستور مربوط به پایگاه داده ی خود را چک کنید.

فرض کنید می خواهیم index ای بسازیم که idx_lastname نام دارد و روی ستون LastName از جدول Persons پیاده سازی می شود. در این صورت به این شکل عمل می کنید:

CREATE INDEX idx_lastname
ON Persons (LastName);

اگر قصد دارید این کار را برای چندین ستون انجام دهید نیز باید بنویسید:

CREATE INDEX idx_pname
ON Persons (LastName, FirstName);

حذف INDEX

برای حذف index از یک ستون و جدول می توانید از ساختار های زیر استفاده کنید:

برای MS Access:

DROP INDEX index_name ON table_name;

برای SQL Server:

DROP INDEX table_name.index_name;

برای DB2/Oracle:

DROP INDEX index_name;

برای MySQL:

ALTER TABLE table_name
DROP INDEX index_name;

این ها آخرین موارد constraint ها بودند. در قسمت های آینده برخی از مباحث تکمیلی زبان SQL را ذکر کرده و دوره را به اتمام می رسانیم. امیدوارم این قسمت برایتان مفید بوده باشد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

کامران
19 آذر 1398
سلام تشکر میکنم واسه سایت خوبتون و خسته نباشید میگم یک سوال برام پیش اومده در مثال هاتون کلمه هایی مثل CHK_PersonAge هست منظورتون از chk و PersonAge دقیقا چیه و چطور باید محدودیت age => 18 رو برای مثال از جدولی به نام customers حذف کنیم؟ ممنون میشم راهنمایی کنین کلی سرچ کردن اما نمونه دیگه ای پیدا نکردم! همه سایت ها همین مثال رو زدن متاسفانه! خیلی ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
20 آذر 1398
سلام دوست عزیز، PersonAge در واقع اسم یکی از ستون های جدول فرضی ما است. chk هم مخفف همون check هست یعنی چک کن که personAge (نام کاربر) بیشتر از 18 باشه. اون CHK_PersonAge نامی هست که برای constraint خودمون انتخاب کردیم. مثلا کد زیر: CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') اینجا CHK_Person یه اسم هست که واسه CHECK انتخاب کردیم. حالا اگه بخوام همین محدودیت که اسمش CHK_Person بود رو بردارم می تونم از دستور زیر استفاده کنم: ALTER TABLE Persons DROP CONSTRAINT CHK_PersonAge; کلمه ی DROP حذف می کنه.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.