1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (9 Oy, Ortalama: 4.22)
Loading ... Loading ...

Aslında ilginç bir başlık oldu. Ama bu şekilde başlamak zorunda kaldım. Pek çok insan Foreign Key’i tam manasıyla kullanmasını bilmiyor yada kullanıyor ama teorik olarak ne işe yaradığını bilmiyor. Genellikle foreign key kullanarak, tabloları ilişkilendirmede kullanırız.

Peki ya ilişkilendirme sırasında foreign key ne işe yarar?

Constraint’lerin Türkçe karşılığı kısıtlayıcılar demektir. İlişkilendirilen Bir tablonun belli yada belirli sutünlarına girilecek değerleri, ilişkilenen başka bir tablonun bir sütunundaki değer kümesiyle kısıtlamak için kullanılır. Kısıtlama sonunda İlişkilendirilen tablonun Foreign Key alanlarına girilecek değerlerin ilişkilenen tablonun birincil ( Primary Key ) alanında bulunan değerler kümesinde yer alan değerlerin kabul edilmesi, yer almayan değerlerinde kabul edilmemesi sağlanarak kısıtlanmış olur. Eğer Foreign Key kullanmadan ilişikilendirme yapmak istersek, ilişkilendirelen tabloya, ilişkilenen tablonun birincil alanının değerler kümesinde bulunmayan değerleri rahatlıkla girelebilir hale gelir. Bunu birazdan Örnekler açıkladığımda dahada iyi anlayacaksınız…

NOT: Foreign Key ile sadece girdiler kontrol edilmez. ON DELETE, ON CASCADE gibi özellikleri kullanılarak referans edilen tabloda bir değişiklik olduğunda yada silindiğinde aynısı ilişkilendirilen tabloyada yansır. Bu makalenin amacı foreign key’in ne olup olmadığı arasında karıştıranlar için hazırladığım için konumuz dışında kalıyor. Belki başka bir makalemde o özelliklerinide anlatırım.

Örneğimizi incelemeden önce örnek çalışmamızın SQL SCRIPT halindeki kodumuzu inceleyebilirsiniz:

CREATE DATABASE [sekopeko]
GO

USE [sekopeko]
GO

CREATE TABLE [dbo].[Takimlar]
(
[TakimID] tinyint identity(1,1) NOT
NULL,
[TakimAdi] nvarchar(50) NOT NULL

CONSTRAINT [PK_TakimID] PRIMARY KEY ([TakimID] ASC)
)
GO

CREATE TABLE [dbo].[Oyuncular]
(
[OyuncuID] int identity(1,1) NOT NULL,
[OyuncuAdi] nvarchar(50) NOT NULL,
[OyuncuUyruk] char(2) NOT NULL,
[OyuncuMevki] varchar(10) NULL

CONSTRAINT [PK_OyuncuID] PRIMARY KEY ([OyuncuID] ASC)
)
GO

 

CREATE TABLE [dbo].[Birlestirme_1]
(
[TakimID] tinyint NOT NULL,
[OyuncuID] int identity(1,1) NOT NULL
)
GO

 

CREATE TABLE [dbo].[Birlestirme_1]
(
[TakimID] tinyint NOT NULL,
[OyuncuID] int identity(1,1) NOT NULL

CONSTRAINT [FK_TakimID] FOREIGN KEY (TakimID) REFERENCES [dbo].[Takimlar]([TakimID]),
CONSTRAINT [FK_OyuncuID] FOREIGN KEY (OyuncuID) REFERENCES [dbo].[Oyuncular]([OyuncuID])
)
GO

Veritabanının Diagramı ise:

Foreign Key Nedir? Ne Değildir !

SQL Kodlarından ve Veritabanının Diagramında gördüğünüz gibi 2 tane ana tablomuz var bunlar Takimlar ve Oyuncular. ve bunlardan ayrıca Birlestirme_1 ve Birlestirme_2 diye tablolarıda göreceksiniz. Birlestirme_2 tablosunun 2 kolonunuda Foreign Key ile Takimlar ile Oyuncular tablosuna ilişkilendirildiğini görebildiğinizi umuyorum.Birlestirme_1 tablosunda ise herhangi bir kısıtlama kullanmadık.

.

.

.

.

.

.
Şimdi sıra geldi kayıt eklemeye:

ilk önce 3 tane takım ekleyelim;

INSERT INTO [Takimlar] VALUES (‘Galatasaray’)
INSERT
INTO [Takimlar] VALUES (‘Beşiktaş’)
INSERT
INTO [Takimlar] VALUES (‘Fenerbahçe’)

SELECT * FROM [Takimlar] Sorgusunu Çalıştırdığımızda:

TakimID | TakimAdi
——————
1 | Galatasaray
2 | Beşiktaş
3 | Fenerbahçe
——————
(3 row(s) affected)

Yukarıdaki sorgu sonucumuzda, Takımlarımızın, Takım ID’leri ve Takım Adları geldi.

Şimdi İse 6 tane oyuncu ekleyelim;

INSERT INTO [Oyuncular] VALUES (‘Hakan Şükür’,‘TC’,‘FORVET’)
INSERT
INTO [Oyuncular] VALUES (‘Hasan Şaş’,‘TC’,‘ORTA SAHA’)
INSERT
INTO [Oyuncular] VALUES (‘D.Roberto Carlos’,‘BR’,‘DEFANS’)
INSERT
INTO [Oyuncular] VALUES (‘ALEX’,‘BR’,‘ORTA SAHA’)
INSERT
INTO [Oyuncular] VALUES (‘İbrahim Toraman’,‘TC’,‘DEFANS’)
INSERT
INTO [Oyuncular] VALUES (‘Rüştü Reçber’,‘TC’,‘KALECİ’)

SELECT * FROM [Oyuncular] Sorgusunu Çalıştırdığımızda:

OyuncuID | OyuncuAdi | OyuncuUyruk | OyuncuMevki
————————————————
1 | Hakan Şükür | TC | FORVET
2 | Hasan Şaş | TC | ORTA SAHA
3 | D.Roberto Carlos | BR | DEFANS
4 | ALEX | BR | ORTA SAHA
5 | İbrahim Toraman | TC | DEFANS
6 | Rüştü Reçber | TC | KALECİ
————————————————
(6 row(s) affected)

Yukarıdaki sorgu sonucumuzda Oyuncularımızın Oyuncu ID’si Oyuncu Adlar, Uyrukları ve Mevkileri Geldi…

Şimdi Bu saygı değer futbolcularımızı öyle bir tabloya koyalım ki ait oldukları takımlarda gözüksünler.

İlk önce Kısıtlama(Foreign Key) KULLANMADIĞIMIZ tablo olan Birlestirme_1 tablosuyla başlayalım.

INSERT INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (1,1)
INSERT
INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (1,2)
INSERT
INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (3,4)
INSERT
INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (3,3)
INSERT
INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (2,6)
INSERT
INTO [Birlestirme_1](TakimID,OyuncuID) VALUES (2,5)

Ekleme sorgumuzda görebileceğiniz gibi Birlestirme_1 tablosunda sadece TakimID’leri ve OyuncuID’lerini girdik. Takımları ve Oyuncuları Ekledikten sonra select sorgumuzla takımların ve oyuncuların ID’lerini görmüştük.

Şimdi  iki tabloyu birbirine bağlı olarak sorgulamak için asıl sorgumuzu yazmaya geldik.

———————————————————
SELECT TakimAdi,OyuncuAdi,OyuncuUyruk,OyuncuMevki
FROM
Birlestirme_1,Takimlar,Oyuncular
WHERE
Birlestirme_1.TakimID = Takimlar.TakimID
AND
Birlestirme_1.OyuncuID = Oyuncular.OyuncuID
———————————————————
SELECT t.TakimAdi,o.OyuncuAdi,o.OyuncuUyruk,o.OyuncuMevki
FROM
Birlestirme_1 as b,Takimlar as t,Oyuncular as o
WHERE
b.TakimID = t.TakimID
AND
b.OyuncuID = o.OyuncuID
———————————————————
SELECT TakimAdi,OyuncuAdi,OyuncuUyruk,OyuncuMevki
FROM
Birlestirme_1
JOIN
Takimlar
ON
Birlestirme_1.TakimID = Takimlar.TakimID
JOIN
Oyuncular
ON
Birlestirme_1.OyuncuID = Oyuncular.OyuncuID
———————————————————
SELECT t.TakimAdi,o.OyuncuAdi,o.OyuncuUyruk,o.OyuncuMevki
FROM
Birlestirme_1 as b
JOIN
Takimlar as t
ON
b.TakimID = t.TakimID
JOIN
Oyuncular as o
ON
b.OyuncuID = o.OyuncuID
———————————————————

Birlestirme_1 tablosundaki verileri ilişkili bir şekilde sorgulamak için 4 farklı sorgulama çeşidini yukarıda yazdım. Aslında daha fazla çeşit var, abartmamak için 4 tane yazdım. Bu sorgularımızdan herhangi birini çalıştırdığımızda aşağıdaki sonucu alırız:

TakimAdi | OyuncuAdi | OyuncuUyruk | OyuncuMevki
————————————————
Galatasaray
| Hakan Şükür | TC | FORVET
Galatasaray
| Hasan Şaş | TC | ORTA SAHA
Fenerbahçe
| ALEX | BR | ORTA SAHA
Fenerbahçe
| D.Roberto Carlos | BR | DEFANS
Beşiktaş
| Rüştü Reçber | TC | KALECİ
Beşiktaş
| İbrahim Toraman | TC | DEFANS
————————————————
(6 row(s) affected)

Sorgu sonucunda gördüğünüz gibi foreign key kullanmadan birbiriyle ilişkili tabloları sorunsuzca getirdik..iki tabloyu birbirine bağlı olarak olarak sorgulamak için illa foreign key kullanmak gerekmez.

Tamam sorun yok ama asıl sorun burdan sonra başlıyor. Şimdi bizim 3 tane takımız var. Ve bunların ID’leri sırasıyla 1,2 ve 3. Peki kullanıcı Birlestirme_1 tablosuna kayıt eklerken TakimID satırına 4 yada 5 girerse ne olacak. Sizce eklermi? tabikede ekler (isterseniz deneyip kendi gözlerinizle görebilirsiniz) çünkü herhangi bir kısıtlayıcı yok! Kontrol YOK! işte FOREIGN KEY BURDA DEVREYE GİRİYOR ! ! !

Şimdi Foreign Key kısıtlayıcımız olan Birlestirme_2 tablomuza, Takimlar tablomuzun TakimID’sinde yer almayan değerler girmeye çalışacam:

INSERT INTO [Birlestirme_2](TakimID,OyuncuID) VALUES (4,3)

Hatırlarsanız Bizim takimlar tablomuzun TakimID kolonunda sadece 1,2 ve 3 ID’leri yer alıyordu. Ama biz Birlestirme_2 tablosuna ekleme sorgumuzda TakımID kolonuna 4 dedik. Yine Hatırlarsanız Birlestirme_1 tablosuna 4 nolu takım ID’si olmadığı halde ekleme şansımız vardı. Peki sizce Birlestirme_2 tablosuna eklermi dersiniz? HAYIR eklemez, ekleyemez çünkü kısıtlayıcı var kontrol var! FOREIGN KEY VAR !

sorgumuzu çalıştırdıktan sonra şöyle bir hata ile karşılaşıyoruz:

The INSERT statement conflicted with the FOREIGN KEY constraint “FK_TakimID”. The conflict occurred in database “sekopeko”, table “dbo.Takimlar”, column ‘TakimID’.

Türkçe çevirmek gerekirse, FK_TakimID adında bir constraint yani kısıtlayıcı var diyor(foreign key). sekopeko veritabanında dbo.Takimlar tablosunun TakimID kolonunda Yer almayan Bir Değer GİREMEZSİNİZ şeklinde bir hata veriyor.

Aşağıdaki 3 maddeyi ve Örneği Unutmadıktan sonra “Foreign Key Nedir? Ne Değildir !” Sorusuna artık rahatçana cevap verebilirsiniz.

1. FOREIGN KEY İLE VERİ BAĞLAMADIK ve BİRLEŞTİRME YAPMADIK. SADECE GİRİLECEK VERİYİ KONTROL ETTİRDİK.
2. FOREIGN KEY OLMADAN İLİŞKİLİ TABLOLAR OLUŞTURABİLDİK. ANCAK GİRİLECEK VERİYE KISITLAMA YAPAMADIK.
3. TABLOLARI BİRBİRİNE BAĞLI OLARAK SORGULAMAK İÇİN İLLAKİ FOREIGN KEY KULLANMAMIZ GEREKMEZ.

Tüm SQL Kodlarını Burdan İndirebilirsiniz.

Toplam Okunma: 3510, Bugün: 4