۴.۱
(۷)

دستور cascade در SQL، در اکثر مواقع برای حذف کردن و یا آپدیت کردن سطرها و سطرهای مرتبط در جدوال مربوطه از استور پروسیجر بهره می بریم ، ولی می توان این عملیات را توسط اعمال کردن CASCADE در Foreign Key Consraints انجام داد.

دستور cascade در SQL

فرض کنید دو جدول به نام های dbo.Albums و dbo.Tracks داریم ، که به ترتیب حاوی لیست آلبوم ها و آهنگ هاست. همانطور که خودتان هم قطعا حدس زده اید dbo.Tracks دارای یک Foreign Key Constraint با ستونی مثلا به نام AlbumId به جدول dbo.Albums می باشد. حال اگر یک AlbumId در جدول Adbo.Albums آپدیت شود این آپدیت می بایستی روی تمامی آهنگ های جدول dbo.Tracks که دارای آن AlbumId بودند اعمال شود. این کار را می توانیم با قابلیتی به نام CASCADE به صورت خودکار انجام دهیم.
دوره آموزشی SQL Server ویژه برنامه‌نویسان

حالت های دستور cascade در SQL

در این بخش از مقاله انواع حالت دستور cascade در پایگاه داده SQL را قرار است بررسی کنیم با ما همراه باشید:

حالت SET NULL 

این حالت باعث می شود تا ستون مربوطه پس از دستور UPDATE یا DELETE شدن مرجع آن به NULL تغییر مقدار دهد.

حالت CASCADE 

این حالت باعث می شود تا پس از UPDATE شدن مقدار مرجع ، مقدار ستون مربوطه نیز آپدیت شده و پس از حذف شدن نیز سطر مربوطه حذف خواهد شد. شما می‌توانید کوئری نویسی را به صورت گام‌به‌گام از نیک آموز فرا بگیرید. 

حالت SET Default 

پس از اعمال دستور UPDATE یا دستور DELETE در مقدار مرجع مقادیر مربوطه به مقدار Default آن ستون تغییر مقدار خواهند داد.

حالت No Action 

این حالت، حالت پیش فرض می باشد ، یعنی با زدن UPDATE/DELETE اتفاقی نمی افتد و error خواهید گرفت. افراد علاقه‌مند می‌توانند با مطالعه مقاله پرکاربردترین دستورات SQL Server، دانش خود را در زمینه کوئری‌نویسی گسترش دهند.
به این مثال دقت کنید :
CREATE TABLE dbo.Albums
(
AlbumID INT PRIMARY KEY,
Name VARCHAR(50)
)
CREATE TABLE dbo.Tracks
(
TrackID INT PRIMARY KEY,
Title VARCHAR(50),
AlbumID INT REFERENCES Albums(AlbumID)
ON DELETE SET NULL
ON UPDATE CASCADE,
Duration TIME(0)
)
INSERT INTO dbo.Albums (AlbumID, Name)
VALUES (1,'Death Magnetic'), (4,'Master Of Puppets')
INSERT INTO dbo.Tracks (TrackID, Title, AlbumID, Duration)
VALUES (1, 'That Was Just Your Life' , 1, '00:07:08'),
(۲, 'The End Of The Line', 1, '00:07:52'),
(۳, 'The Day That Never Comes', 1, '00:07:56'),
(۴, 'Battery', 4, '00:05:12')
در مثال بالا AlbumId در جدول dbo.Tracks به AlbumId در جدول dbo.Albums اشاره می کند. دو حالت CASCADE تعریف شده است.

حالت ON DELETE SET NULL

وقتی سطری از جدول dbo.Albums پاک می شود تمامی سطرهایی که آن Id را در جدول dbo.Tracks داشتند دارای Id NULL  خواهند شد.

حالت ON UPDATE CASCADE

وقتی یک AlbumId در جدول dbo.Albums آپدیت می شود تمام سطرهایی که در جدول dbo.Tracks آن Id را داشتند Idشان به Id جدید آپدیت خواهد شد.
حال بیایید یک سطر از جدول dbo.Albums را آپدیت کنیم
UPDATE dbo.Albums
SET AlbumID = 2
WHERE AlbumID = 4
SELECT A.AlbumID, A.Name,
T.TrackID, T.Title, T.AlbumID, T.Duration
FROM dbo.Albums A
RIGHT JOIN dbo.Tracks T ON A.AlbumID = T.AlbumID
شما می‌توانید نتیجه در ادامه مشاهده کنید:
(۱ row(s) affected)
 
Duration AlbumID Title TrackID Name AlbumID
 ۰۰:۰۷:۰۸ ۱  That Was Just Your Life ۱ Death Magnetic ۱
 ۰۰:۰۷:۵۲ ۱ The End Of The Line ۱ Death Magnetic ۲
 ۰۰:۰۷:۵۶ ۱ The Day That Never Comes ۱ Death Magnetic ۳
۰۰:۰۵:۱۲ ۲  Battery ۲ Master Of Puppets ۴
                                           
(۴ row(s) affected)
در مثال بالا دیدیم که AlbumId در جدول dbo.Tracks نیز به مقدار ۲ آپدیت شد ، مقدار قبلی ۴ بود.

برای DELETE

DELETE FROM dbo.Albums
WHERE AlbumID = 1
SELECT A.AlbumID, A.Name,
T.TrackID, T.Title, T.AlbumID, T.Duration
FROM dbo.Albums A
RIGHT JOIN dbo.Tracks T ON A.AlbumID = T.AlbumID
 
شما می‌توانید نتیجه در ادامه مشاهده کنید:
(۱ row(s) affected)
 
Duration AlbumID Title TrackID Name AlbumID
۰۰:۰۷:۰۸ NULL  That Was Just Your Life ۱ NULL NULL
00:۰۷:۵۲ NULL The End Of The Line ۲ NULL NULL
00:۰۷:۵۶ NULL The Day That Never Comes ۳ NULL NULL
 ۰۰:۰۵:۱۲ ۲ Battery ۴ Master Of Puppets ۲

(۴ row(s) affected)
 

سخن پایانی 

در پایان دستور cascade در SQL برای اینکه ببینید کدام یک از Foreign Keyهای شما از قابلیت CASCADE استفاده می کنند می توانید از sys.foreign_keys بهره ببرید. در این مقاله به بررسی این دستور در SQL Server پرداختیم. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم.
SELECT name AS [Constraint Name],
OBJECT_NAME(referenced_object_id) [Referenced Object],
OBJECT_NAME(parent_object_id) [Parent Object],
delete_referential_action_desc [ON DELETE],
update_referential_action_desc [ON UPDATE]
FROM sys.foreign_keys

چه رتبه ای می‌دهید؟

میانگین ۴.۱ / ۵. از مجموع ۷

اولین نفر باش