با سلام و عرض ادب خدمت شما همراهان گرامی روکسو، در قسمت قبلی از این سری آموزشی در رابطه با قوانینی صحبت کردیم که بر جدول ها حاکم هستند. دسته ای از این قوانین تعیین کننده ی Datatype ها یا نوع داده هایی بودند که روی هر فیلد جدول اعمال می شود و رفتار آن را مشخص می کند. دسته ی دیگر وظیفه ی مشخص کردن Primary Key ها و ... را داشتند و الی آخر. ما به این قوانین constraint میگوییم که در لغت به معنی «قید» یا «محدودیت» است.
همچنین گفتیم که در دو جا می توان از constraint ها استفاده کرد:
CREATE TABLE
ALTER TABLE
ساختار کلی constraint ها را در کد زیر مشاهده می کنید:
CREATE TABLE table_name ( column1 datatype constraint, column2 datatype constraint, column3 datatype constraint, .... );
همچنین گفتیم که constraint ها در دو سطح فعالیت می کنند:
لیست constraint های زبان SQL را مشاهده می کنید:
در قسمت قبل در مورد NOT NULL و همچنین UNIQUE صحبت کردیم و در این قسمت می خواهیم در رابطه با دیگر موارد بحث کنیم.
PRIMARY KEY ها (به معنی «کلید اولیه») داده های یک جدول را به صورت خاص شناسایی می کنند. داده های PRIMARY KEY باید مقادیر UNIQUE داشته باشند و همچنین نمی توانند NULL باشند. در ضمن، هر جدول تنها می تواند یک PRIMARY KEY داشته باشد که خود می تواند از یک یا چند فیلد تشکیل شده باشد.
فرض کنید بخواهیم ستون ID را به عنوان PRIMARY KEY جدول تعریف کنیم. در این صورت در MySQL به این شکل عمل می کنیم:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (ID) );
و در SQL Server و Oracle و MS Access به این شکل عمل می کنیم:
CREATE TABLE Persons ( ID int NOT NULL PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
البته اگر می خواهید اجازه دهید تا PRIMARY KEY نام گذاری شود و همچنین روی چندین ستون اعمال شود، می توانید از ساختار زیر برای تمام پایگاه های داده استفاده کنید:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CONSTRAINT PK_Person PRIMARY KEY (ID,LastName) );
سوال: مگر نگفتیم که هر جدول فقط یک PRIMARY KEY دارد؟ پس چطور در مثال بالا آن را روی چند ستون اعمال کردیم؟!
پاسخ: مثال بالا تنها داری یک PRIMARY KEY است و آن هم PK_Person می باشد اما مقدار یا محتوای PRIMARY KEY از دو ستون تشکیل شده است (ID و LastName).
اگر بخواهید از PRIMARY KEY در دستور ALTER TABLE استفاده کنید باید به شیوه ی دیگر عمل کنید. تصور کنید از قبل جدولی داریم و می خواهیم ستون ID آن را به عنوان PRIMARY KEY تعیین کنیم. در این صورت برای MySQL و SQL Server و Oracle و MS Access می نویسیم:
ALTER TABLE Persons ADD PRIMARY KEY (ID);
و اگر بخواهیم PRIMARY KEY روی چندین ستون پیاده سازی شود می گوییم:
ALTER TABLE Persons ADD CONSTRAINT PK_Person PRIMARY KEY (ID,LastName);
هشدار: اگر می خواهید از دستور ALTER TABLE برای تعیین PRIMARY KEY استفاده کنید باید مطمئن شوید که ستون های مورد نظرتان، در هنگام ساختن جدول، از قبل طوری تنظیم شده باشند که مقادیر NULL نداشته باشند.
همچنین برای حذف یک PRIMARY KEY می توانید از دستور زیر برای MySQL استفاده کنید:
ALTER TABLE Persons DROP PRIMARY KEY;
و از این دستور برای SQL Server و Oracle و MS Access:
ALTER TABLE Persons DROP CONSTRAINT PK_Person;
سوال: فایده و کاربرد PRIMARY KEY ها چیست؟
پاسخ: همانطور که گفتیم، PRIMARY KEY معمولا به صورت یک ستون خاص انتخاب می شوند. ما بعدا می توانیم از این ستون خاص برای شناسایی یک ردیف استفاده کنیم. به طور مثال اگر ستون ID را به عنوان PRIMARY KEY در نظر بگیریم می توانیم از طریق هر id ردیف مورد نظرش (یعنی یکی از کاربران خود) را پیدا کنیم. همچنین در محیط هایی مانند MySQL می توانیم PRIMARY KEY را به عنوان FOREIGN KEY یک جدول دیگر در نظر بگیریم و بین دو جدول رابطه ایجاد کنیم! آیا می دانید FOREIGN KEY چیست؟
FOREIGN KEY (به معنی «کلید خارجی») برای متصل کردن دو جدول به هم استفاده می شود. در واقع FOREIGN KEY ها یک فیلد یا مجموعه ای از فیلد های جدول هستند که به PRIMARY KEY های یک جدول دیگر اشاره می کنند! در این حالت جدولی که foreign key را داشته باشد «جدول فرزند» یا child table و جدول دیگر «جدول پدر» یا parent table نام خواهد داشت.
به دو جدول زیر نگاه کنید:
جدول Persons:
Age | FirstName | LastName | PersonID |
30 | Ola | Hansen | 1 |
23 | Tove | Svendson | 2 |
20 | Kari | Pettersen | 3 |
جدول Orders:
PersonID | OrderNumber | OrderID |
3 | 77895 | 1 |
3 | 44678 | 2 |
2 | 22456 | 3 |
1 | 24562 | 4 |
اگر دقت کنید متوجه می شوید که ستون PersonID در جدول Orders به ستونِ PersonID در جدول Persons اشاره می کند! بنابراین می توان گفت:
باید بدانید FOREIGN KEY از کارهایی که باعث نابود شدن ارتباط بین دو جدول می شوند جلوگیری می کند. همچنین از وارد شدن داده های نامعتبر به ستونِ FOREIGN KEY جلوگیری می کند چرا که FOREIGN KEY باید یکی از مقادیر جدولی را داشته باشد که در حال اشاره به آن است.
فرض کنید می خواهیم ستون PersonID را به عنوان FOREIGN KEY تعیین کنیم (هنگام ساخت یک جدول):
در MySQL می گوییم:
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) );
در SQL Server و Oracle و MS Access میگوییم:
CREATE TABLE Orders ( OrderID int NOT NULL PRIMARY KEY, OrderNumber int NOT NULL, PersonID int FOREIGN KEY REFERENCES Persons(PersonID) );
نکته: اگر می خواهید FOREIGN KEY را در چند ستون اجرا کنید از ساختار زیر برای تمام پایگاه های داده استفاده کنید:
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) );
فرض کنید می خواهیم PersonID را به عنوان FOREIGN KEY تعیین کنیم اما جدول Orders از قبل ساخته شده است بنابراین با دستور ALTER TABLE می نویسیم:
ALTER TABLE Orders ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
همچنین برای پیاده سازی آن روی چندین ستون مختلف می توانیم از ساختار زیر استفاده کنیم:
ALTER TABLE Orders ADD CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
ساختار های بالا بر روی MySQL و SQL Server و Oracle و MS Access جواب می دهند.
برای حذف FOREIGN KEY در MySQL می توانیم از ساختار زیر استفاده کنیم:
ALTER TABLE Orders DROP FOREIGN KEY FK_PersonOrder;
اما اگر از SQL Server و Oracle و MS Access استفاده می کنید باید پیرو دستور زیر باشید:
ALTER TABLE Orders DROP CONSTRAINT FK_PersonOrder;
امیدوارم از این قسمت استفاده ی کافی را برده باشید. در قسمت بعد constraint های بیشتر را بررسی می کنیم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.