இந்த கட்டுரையில் பேரண்ட் டேபிளில் ஒரு ரோவை டெலீட் செய்தால் சைல்ட் டேபிளில் உள்ள அது தொடர்பான ரோக்கள் தானாக டெலீட் செய்வது எப்படி என்று காண இருக்கின்றோம்.
இதற்கு முதலில் இரண்டு டேபிளை உருவாக்குவோம்.
Create table Departments
(
Id int primary key identity,
[Name] nvarchar(50)
)
Go
Create table Employees
(
Id int primary key identity,
[Name] nvarchar(50),
DeptId int foreign key references Departments(Id)
)
Go
எம்ப்ளாயிஸ் டேபிளில் deptid ஆனது டிபார்ட்மெண்ட் டேபிளில் உள்ள id என்ற ஃபீல்டை ஃபாரின் கீயாக ரெஃபெர் செய்கின்றது.
அதாவது டிபார்ட்மென்ட் டேபிளில் id என்ற ஃபீட்டிற்கு என்னென மதிப்பு கொடுத்திருக்கிறோமோ அதிலிருந்து ஒன்றை தான் எம்ப்ளாயிஸ் டேபிளில் உள்ள deptid என்ற ஃபீல்டுக்கு மதிப்பிருத்த முடியும்.
Insert into Departments values ('IT')
Insert into
Departments values ('HR')
Go
Insert into Employees values ('Mark', 1)
Insert into
Employees values ('Mary',
1)
Insert into
Employees values ('John',
2)
Insert into
Employees values ('Sara',
2)
Insert into
Employees values ('Steve',
2)
டிபார்ட்மெண்ட்ஸ் டேபிளில் id ஃபீல்டிற்கு 1, 2 என இரு மதிப்பு தான் இருக்கின்றது. எம்ப்ளாயிஸ் டேபிளில் deptid ஃபீல்டிற்கு 1, 2 தவிர எந்த மதிப்பும் இல்லை என்பதை கவனிக்கவும்.வேறு மதிப்பு இருத்தினாலும் டேட்டாபேஸ் சிஸ்டம் ஏற்காது. இது தான் ஃபாரின் கீ கருத்துரு ஆகும்.
இப்பொழுது டிபார்ட்மெண்ட் டேபிளில் id 1 என்ற ரோவை டெலீட் செய்தால் எம்ப்ளாயிஸ் டேபிளில் deptid 1 என்ற மதிப்புள்ள ரோக்கள் தானாக டெலீட் ஆக வேண்டும்.
முதலில் சைல்ட் டேபிளீல் ஒரு குறிப்பிட்ட மதிப்புள்ள ரோவை டெலீட் செய்யாமல் பேரண்ட் டேபிளில் டெலீட் செய்ய இயலாது. அதாவது எம்ப்ளாயிஸ் டேபிளில் depd id 1 என்று உள்ள ரோவையும் டெலீட் செய்தால் தான் டிபார்ட்மெண்ட்ஸ் டேபிளீள் id 1 என்று உள்ள ரோவை டெலீட் செய்ய இயலும்.
இல்லையெனில் பிழை சுட்டப்படும்.
ஆனால் கேஸ்கேட் டெலீட் மூலம் அவ்வாறு செய்ய இயலும்.
இதற்கு முதலில் ஏற்கெனவே ஃபாரின் கீ இருந்தால் டெலீட் செய்யவும்.
அதற்கான சிண்டாக்ஸ்.
Alter table Employees drop constraint Constraint_Name
இப்பொழுது ஃஃபாரின் கீயை பின் வருமாரு உருவாக்கவும்.
Alter table Employees
add constraint FK_Dept_Employees_Cascade_Delete
foreign key (DeptId) references Departments(Id) on delete cascade
கடைசியாக on delete cascade என்று குறிப்பிடப்பட்டிருப்பதை கவனிக்கவும்.இப்பொழுது டிபார்ட்மெண்ட் டேபிளில் ஒரு ரோவை டெலீட் செய்தால் அது தொடர்பான ரோக்கள் எம்ப்ளாயிஸ் டேபிளில் டெலீட் ஆகும்.
ஒன்றுக்கு மேற்பட்ட டேபிள்களில் ஒரே ஃபாரின் கீ.
Create table Gender
(
Id int primary key identity,
Gender nvarchar(20)
)
Go
Create table Teachers
(
Id int primary key identity,
[Name] nvarchar(50),
GenderId int foreign key references Gender(Id) on
delete cascade
)
Go
Create table Students
(
Id int primary key identity,
[Name] nvarchar(50),
GenderId int foreign key references Gender(Id) on
delete cascade
)
Go
Insert into Gender values ('Male')
Insert into
Gender values ('Female')
Go
Insert into Teachers values ('Mark', 1)
Insert into
Teachers values ('John',
1)
Insert into
Teachers values ('Mary',
2)
Insert into
Teachers values ('Sara',
2)
Insert into
Teachers values ('Flo',
2)
Go
Insert into Students values ('David', 1)
Insert into
Students values ('Ron',
1)
Insert into
Students values ('Jess',
2)
Insert into
Students values ('Tara',
2)
Insert into
Students values ('Innes',
2)
Go
மேலே உள்ள டேபிள்களில் ஒன்றுக்கு மேற்பட்ட டேபிள்கள் ஒரே ஃபாரின் கீயை கொண்டுள்ளன. எல்லாமே on delete cascase என குறிப்பிடப்பட்டுள்ளன.
எனவே gender டேபிளில் ஒரு ரோவை டெலீட் செய்தால் teachers, students என்ற இரண்டு டேபிள்களிலும் ஆட்டோ டெலீட் ஆகும்.
இப்பொழுது நம்மிடம் ஃபாரின் கீ கண்ட்ஸ்ரைண்ட் இல்லையென்றாலோ அல்லது on cascade delete என்று குறிப்பிடப்பட்டாவிடில் என்ன செய்வது என்று பார்ப்போம்.
Alter table Teachers
add constraint
FK_Gender_Employees
foreign key (GenderId)
references Gender(Id)
Alter table Students
add constraint
FK_Gender_Students
foreign key (GenderId)
references Gender(Id)
அதற்கு கீழ் கண்டவாறு கொரி எழுத வேண்டும். முதலில் சைல்ட் டேபிளில் உள்ள ரோக்கள் டெலீட் ஆக வேண்டும். பிறகு தான் பேரண்ட் டேபிளில் உள்ள ரோ டெலீட் ஆக வேண்டும்.ஒட்டு மொத்தமும் ஒரே யுனிட் ஆக எழுதப்பட்டுள்ளது.சைல்ட் டேபிளில் டெலீட் ஆகா விட்டால் ரோல் பேக் ஆக வேண்டும். அதாவது மாற்றங்கள் சேவ் ஆகக்கூடாது.
Begin Try
Begin Tran
Declare @GenderToDelete int = 2
-- Delete first from child tables
Delete from Teachers where
GenderId = @GenderToDelete
Delete from Students where
GenderId = @GenderToDelete
-- Finally Delete from parent table
Delete from Gender where Id
= @GenderToDelete
Commit Tran
End Try
Begin Catch
Rollback Tran
End Catch
பின் குறிப்பு :
முதலில் சைல்ட் டேபிளில் உள்ள ரோவைத்தான் டெலீட் செய்ய வேண்டும். அதன் பிறகே பேரண்ட் டேபிளில் உள்ள ரோவை டெலீட் செய்ய வேண்டும். ஏனெனில் எதிர் காலத்தில் ஃபாரின் கீ சேர்க்கப்பட்டால் கொரி ரிசல்ட் தவறி விடும்.
முத்து கார்த்திகேயன், மதுரை.
No comments:
Post a Comment