با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، و کاربرانی که دوره کامل آموزشSQL Server 2017 را دنبال می کنند. زمانیکه شما از چندین جدول در یک پایگاه داده استفاده می کنید. به احتمال زیاد نیاز دارید که بین تعدادی از جداول ارتباط برقرار کنید. چراکه جدولی زیر مجموعه ی جدول دیگر بوده و یا اینکه ممکن است، یک یا چند جدول زیر مجموعه یک جدول باشند. برای برقراری یک رابطه بین جداول باید حداقل یک فیلد UNIQUE یا یکتا که فقط مقادیر منحصر به فرد را می پذیرد به عنوان کلید اصلی داشته باشید. در ادامه ی آموزش شما را با چگونگی ارتباط بین جداول درSQL Server 2017 یا ارتباط با جداول موجود در پایگاه داده آشنا خواهیم کرد.
پایگاه داده ی رابطه ای، در واقع رابطه ای است که در آن دو یا چند جدول با یکدیگر مرتبط می شوند، زیرا آنها حاوی داده های مربوط به هم هستند.
این کار کاربران را قادر می سازد تا پرس و جوهایی که شامل چند جدول مرتبط می شود، را اجرا کنند.
در ادامه ی آموزش به چگونگی ایجاد ارتباط زیر در پایگاه داده پرداخته ایم:
شکل فوق در واقع رابطه ی بین جداول Albums
و Artists
و رابطه ی بین جداول Albums
و Genres
را توصیف می کند.
رابطه ی بین Albums
و Artists
نشان می دهد که یک Artists(هنرمند) می تواند Albums(آلبوم) های مختلفی داشته باشد.
رابطه بین Albums
و Genres
نشان می دهد که یک ژانر نیز آلبوم های متعددی را شامل می شود.
کد SQL ایجاد جداول فوق و ارتباط بین آنها بصورت زیر خواهد بود:
در تصویر فوق، بخشی که در کادر مشخص کرده ایم ارتباط بین جداول Artists و Albums را نشان می دهد.
اگر از یک رابط گرافیکی مانند SSMS یا SQLOPs در SQL استفاده می کنید، می توانید ارتباط بین جداول را در فولدر Keys مشاهده کنید:
همانطور که در شکل فوق مشاهده می کنید ارتباط بین جداول توسط کلیدها اصلی و خارجی دو جدول نمایش داده می شود.
کد ارتباط جداول در شکل فوق:
1 2 3 4 | CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION |
دو خط اول کد فوق رابطه بین دو جدول Artists و Albums را تعریف می کنند.
کد FK_Albums_Artists
فیلد ArtistId را در جدول Albums به عنوان کلید خارجی تعریف می کند.
REFERENCES dbo.Artists (ArtistId
کلید خارجی فوق را به کلید اصلی جدول Artists ارتباط می دهد.
کدهای ON DELETE NO ACTION
و ON UPDATE NO ACTION
مشخص می کند، هر گونه حذف و ویرایش سطرهای در یک جدول روی جدول دیگر تاثیر نگذاشته و فقط پیغام خطایی به کاربر صادر می شود.
برای اینکه تغییرات در یک جدول در جدول دیگر نیز اعمال شود به جای NO ACTION
از CASCADE
استفاده کنید.
مثال قبل چگونگی ارتباط بین دو جدول در زمان تعریف دو جدول را نشان می دهد. ممکن است بخواهید با یک جدولی که از قبل در پایگاه داده موجود بوده ارتباط برقرار کنید.
برای مثال ارتباط بین دو جدول Genres
و Albums
را بررسی می کنیم:
کد آن بصورت زیر خواهد بود:
1 2 3 4 5 6 7 | USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ; |
کد فوق یک کلید خارجی در جدول Albums که “Albums.GenreId
” می باشد را ایجاد می کند.
سپس Albums.GenreId
را به کلید اصلی Genres.GenreId
در جدول Genres ارجاع می دهد.
نتایج ایجاد ارتباط فوق در رابط گرافیکی در گروه Keys قابل مشاهده است:
کلید های تک ستونی خارجی نیز می تواند در سطح ستون مشخص شود. بنابراین راه دیگری برای ایجاد جدول Albums و کلید خارجی آن این است:
1 2 3 4 5 6 7 8 | CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL ); |
شما می توانید از چند ستون یا فیلد برای تعریف یک کلید خارجی استفاده کنید.
این نوع تعریف معمولا زمانی نیاز می شود که جدول مرجع از چندین ستون برای تعریف کلید اصلی استفاده می کند.
برای استفاده از چند ستون در تعریف کلید خارجی باید نام ستون ها را با کاما (,) از هم جدا کنید.
بنابراین تعریف کلید خارجی چند ستونی برای جدول Albums به این صورت خواهد بود:
1 2 | CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName) |
ایجاد ارتباط صحیح بین جداول یکی از اقدامات اساسی و بسیار مهم در ایجاد یک پایگاه داده ی ایده آل است. چرا که معمولا پایگاه های داده ای که برای ذخیره سازی داده های برنامه های مختلف استفاده می شوند از جداول متعددی استفاده می کنند. که اکثر این جداول باهم ارتباط دارند. از این رو آمورش فوق را به چگونگی ارتباط بین جداول درSQL Server 2017 اختصاص داده ایم.