Birincil ve yabancı anahtarlar üzerindeki kısıtlamalar. Veritabanında anahtar kavramı, birincil ve yabancı anahtarlar İkincil anahtar sql

Şekil, varsayımsal bir işletmenin çalışanları hakkında bazı bilgiler içeren bir tabloyu (derece 5 oranı) göstermektedir. Tablo satırları demetlere karşılık gelir. Her satır aslında, özellikleri sütunlarda yer alan bir gerçek dünya nesnesinin (bu durumda bir çalışan) açıklamasıdır. İlişkisel ilişkiler varlık kümelerine karşılık gelirken demetler varlıklara karşılık gelir. İlişkisel bir ilişkiyi temsil eden bir tablodaki sütunlara denir. Öznitellikler.

Her öznitelik bir etki alanında tanımlanır, bu nedenle etki alanı, o öznitelik için geçerli değerler kümesi olarak düşünülebilir. Aynı etki alanında aynı ilişkinin birkaç niteliği ve hatta farklı ilişkilerin nitelikleri tanımlanabilir.

Değeri benzersiz bir şekilde demetleri tanımlayan bir özniteliğe denir anahtar (ya da sadece anahtar). Anahtar, "Personel numarası" özelliğidir, çünkü değeri işletmenin her çalışanı için benzersizdir. Demetler yalnızca birkaç özelliğin değerleri birleştirilerek tanımlanırsa, ilişkinin bileşik bir anahtara sahip olduğu söylenir.

birincil anahtar- ilişkisel bir veri modelinde, ilişkinin potansiyel anahtarlarından biri, ana anahtar (veya varsayılan anahtar) olarak seçilir.

Bir ilişki birden çok anahtar içerebilir. Her zaman anahtarlardan biri bildirilir öncelik, değerleri güncellenemez. Diğer tüm ilişki anahtarları çağrılır olası anahtarlar.

Teori açısından, ilişkinin tüm potansiyel (olası) anahtarları eşdeğerdir, yani aynı benzersizlik ve minimallik özelliklerine sahiptirler. Bununla birlikte, birincil anahtar olarak, genellikle belirli pratik amaçlar için, örneğin oluşturmak için en uygun olan potansiyel anahtarlardan biri seçilir. harici anahtarları başka yollarla veya kümelenmiş bir dizin oluşturmak için. Bu nedenle, birincil anahtar olarak genellikle en küçük boyuta (fiziksel depolama) sahip olan ve/veya en az öznitelik içeren anahtar seçilir.

Eğer birincil anahtar tek bir öznitelikten oluşur, buna denir basit anahtar.

Eğer birincil anahtar iki veya daha fazla nitelikten oluşur, buna denir bileşik anahtar. Yani ad, soyad, soyadı, pasaport numarası, pasaport serisi iki veya daha fazla kişi için aynı olabileceğinden ayrı ayrı birincil anahtar olamaz. Ancak aynı türden, aynı seri ve numaraya sahip iki kişisel belge yoktur. Bu nedenle, kişiler hakkında veri içeren bir ilişkide birincil anahtar, kişisel belgenin türü, dizisi ve numarasından oluşan bir öznitelik alt kümesi olabilir.



Farklı olarak hiyerarşik ve ağ modelleri ilişkisel verilerde grup ilişkisi kavramı yoktur. Farklı ilişkilerin demetleri arasındaki ilişkileri yansıtmak için anahtarlarının çoğaltılması kullanılır.

Diğer ilişkilerin anahtarlarının kopyaları olan nitelikler, Yabancı anahtarlar.

Örneğin, BÖLÜM ve ÇALIŞAN arasındaki ilişki, birincil anahtarın kopyalanmasıyla oluşturulur. "Bölüm_Numarası" birinci ilişkiden ikinciye. Bu nedenle, belirli bir alt bölümün çalışanlarının bir listesini almak için gereklidir: 1) BÖLÜM tablosundan özellik değerini ayarlayın "Bölüm_Numarası" Verilen "Departman_Adı"na karşılık gelen. 2) ÇALIŞAN tablosundan tüm kayıtları seçin, öznitelik değeri "Bölüm_Numarası"önceki adımda elde edilene eşittir. Bir çalışanın hangi departmanda çalıştığını öğrenmek için ters işlemi yapmanız gerekir: 1) Belirle "Bölüm_Numarası"ÇALIŞAN tablosundan. 2) Elde edilen değere göre BÖLÜM tablosunda bir giriş buluyoruz.


18. İlişkisel veri tabanlarında normalizasyon, veri tabanı tasarımında normal form kavramı.

normal biçim - ilişkisel bir veri modelindeki bir ilişkinin, onu örnekleme veya veri değiştirmenin mantıksal olarak hatalı sonuçlarına yol açabilecek fazlalık açısından karakterize eden bir özelliği. Normal biçim, bir ilişkinin karşılaması gereken gereksinimler kümesi olarak tanımlanır.

Bir veritabanını normal biçim biçimine dönüştürme işlemine denir. normalleşme . Normalleştirme, veritabanının yapısını en az artıklık sağlayan bir forma getirmeyi amaçlar, yani normalleştirme, performansı düşürmeyi veya artırmayı veya veritabanının boyutunu küçültmeyi veya büyütmeyi amaçlamaz. Normalleştirmenin nihai amacı, veritabanında depolanan bilgilerin potansiyel tutarsızlığını azaltmaktır.



Fazlalık genellikle, her ilişkide yalnızca birincil gerçeklerin saklanacağı şekilde ilişkilerin ayrıştırılmasıyla ortadan kaldırılır (yani, diğer saklanan gerçeklerden türetilmeyen gerçekler).

fonksiyonel bağımlılıklar

İlişkisel bir veritabanı hem yapısal hem de anlamsal bilgileri içerir. Bir veritabanının yapısı, içerdiği ilişkilerin sayısı ve türü ile bu ilişkilerin demetleri arasında var olan bire çok ilişkiler tarafından belirlenir. Anlamsal kısım, bu ilişkilerin öznitelikleri arasında var olan işlevsel bağımlılıklar kümesini tanımlar. İşlevsel bağımlılığın bir tanımını verelim.

19. 1NF: Temel tanımlar ve dönüşüm kuralları.

İlk normal formu tartışmak için iki tanımın verilmesi gerekir:

basit özellik - değerleri atomik (bölünemez) olan bir nitelik.

Karmaşık özellik - aynı veya farklı alanlarda tanımlanabilen birkaç atomik özniteliğin birleştirilmesiyle elde edilir (buna vektör veya veri toplaması da denir).

Birinci normal formun tanımı:

tüm niteliklerinin değerleri atomik ise, bir ilişki 1NF'dedir. . Aksi takdirde, bu bir tablo değildir ve bu tür niteliklerin ayrıştırılması gerekir.

Bir örnek düşünün:

İşletmenin İK veritabanının, çalışanlarla ilgili olarak temsil etmeye çalışabileceğiniz bilgileri depolaması gerekir.

ÇALIŞAN(EMPLOYEE_NUMBER, ADI, DOĞUM_TARİHİ, İŞ_TARİHİ, ÇOCUK).

Bu ilişkinin dikkatli bir incelemesinden, niteliklerin "iş geçmişi" Ve "çocuklar" karmaşıktır, üstelik nitelik "iş geçmişi" başka bir karmaşık özellik içerir "maaş_geçmişi".
Bu birimler şöyle görünür:

 HISTORY_WORK (DATE_RECEPTION, NAME, HISTORY_SALARY),

 HISTORY_SALARY (DATE_APPOINTMENT, MAAŞ),

ÇOCUKLAR (CHILD_NAME, BIRTH_YEAR).

İlişkileri Şekil l'de gösterilmiştir. 3.3.

Şekil 3.3. İlk ilişki.

ÇALIŞAN orijinal ilişkisini ilk normal forma getirmek için, aşağıdaki şekilde gösterildiği gibi, onu dört ilişkiye ayrıştırmak gerekir:

Şekil 3.4. Normalleştirilmiş ilişkiler kümesi.

Burada, her bir ilişkinin birincil anahtarı mavi renkle vurgulanmıştır, yabancı anahtarların adları yazı tipindedir. mavi renk. Orijinal ilişkide var olan işlevsel bağımlılıkları temsil etmeye hizmet eden yabancı anahtarlar olduğunu hatırlayın. Bu işlevsel bağımlılıklar oklu çizgilerle gösterilir.

Normalleştirme algoritması EF Codd tarafından şu şekilde tanımlanmaktadır:

  • Ağacın tepesindeki ilişkiden başlayarak (Şekil 3.3), onun birincil anahtarı alınır ve hemen bağımlı olan her bir ilişki, o birincil anahtarın etki alanı veya etki alanları kombinasyonu eklenerek genişletilir.
  • Bu şekilde genişletilen her ilişkinin Birincil Anahtarı, ilişkinin genişlemeden önce sahip olduğu Birincil Anahtardan ve ana ilişkinin eklenen Birincil Anahtarından oluşur.
  • Bundan sonra, basit olmayan tüm alanlar üst ilişkiden silinir, ağacın üst düğümü kaldırılır ve kalan alt ağaçların her biri için aynı prosedür tekrarlanır.

20. 2NF: Temel tanımlar ve dönüşüm kuralları.

Çoğu zaman, bir ilişkinin birincil anahtarı birkaç özellik içerir (bu durumda buna bileşik) - örneğin, Şek. 3.4 soru 19. Bu, kavramı tanıtır tam fonksiyonel bağımlılık.

Tanım:

Anahtar olmayan bir öznitelik, bir bütün olarak anahtara işlevsel olarak bağımlıysa, ancak işlevsel olarak onu oluşturan özniteliklerin herhangi birine işlevsel olarak bağımlı değilse, işlevsel olarak bileşik bir anahtara bağımlıdır.

Örnek:

ARZ ilişkisi olsun (N_TEDARİKÇİ, ÜRÜN, FİYAT).
Bir tedarikçi farklı mallar tedarik edebilir ve aynı mallar farklı tedarikçiler tarafından tedarik edilebilir. O zaman ilişki anahtarı "N_tedarikçi + öğe". Tüm tedarikçilerin aynı fiyata mal tedarik etmesine izin verin. O zaman aşağıdaki işlevsel bağımlılıklara sahibiz:

  • N_tedarikçi, öğe -> fiyat
  • ürün -> fiyat

Anahtardaki "fiyat" özniteliğinin eksik işlevsel bağımlılığı, aşağıdaki anormalliğe yol açar: tam görüntü tedarikçilerinin tüm kayıtlarını değiştirmek için ilişki. Bu anormallik, iki anlamsal olgunun tek bir veri yapısında birleştirilmesi gerçeğinin bir sonucudur. Aşağıdaki genişletme, 2NF'deki ilişkiyi verir:

  • TESLİMAT (N_TEDARİKÇİ, ÜRÜN)
  • ÜRÜN_PRICE (TİCARET, FİYAT)

Böylece, bir verebilir

İkinci normal formun tanımı: Bir ilişki 1NF'deyse ve anahtar olmayan her öznitelik işlevsel olarak anahtara bağımlıysa 2NF'dedir.

21. 3NF: Temel Tanımlar ve dönüşüm kuralları.

Üçüncü normal formu tartışmadan önce kavramı tanıtmak gerekir: geçişli fonksiyonel bağımlılık.

Tanım:

X, Y, Z bir ilişkinin üç niteliği olsun. Bu durumda X --> Y ve Y --> Z olur ama ters karşılık gelmez, yani. Z -/-> Y ve Y -/-> X. O zaman Z geçişli olarak X'e bağlıdır.
DEPOLAMA ilişkisi olsun ( FİRMA, ANTREPO, HACİM), depolardan mal alan firmalar ve bu depoların hacimleri hakkında bilgiler içerir. Anahtar özelliği - "firma". Her firma yalnızca bir depodan mal teslim alabiliyorsa, bu durumda aşağıdaki işlevsel bağımlılıklar vardır:

  • firma -> stoklamak
  • stoklamak -> hacim

Bu anormallikler yaratır:

  • eğer içinde şu an hiçbir şirket depodan mal almazsa, hacmiyle ilgili veriler veri tabanına girilemez (çünkü anahtar özelliği tanımlanmamıştır)
  • depo hacmi değişirse bu depo ile ilişkili tüm firmalar için tüm ilişkinin görüntülenmesi ve kartların değiştirilmesi gerekir.

Bu anormallikleri ortadan kaldırmak için orijinal ilişkiyi ikiye ayırmak gerekir:

  • DEPOLAMAK ( FİRMA, STOKLAMAK)
  • STOK_HACMİ ( STOKLAMAK, HACİM)

Üçüncü normal formun tanımı:

Bir ilişki 2NF'deyse ve anahtar olmayan her öznitelik birincil anahtara geçişli olarak bağımlı değilse 3NF'dedir.

Bunlar, erişimi bir veya daha fazla bilgisayar kullanılarak gerçekleştirilen elektronik bilgi depolarıdır. Tipik olarak, belirli bir konu alanı, yani insan faaliyetinin bir alanı veya gerçek dünyanın bir kısmı hakkında bilgi içeren verileri depolamak ve bunlara erişmek için veritabanları oluşturulur.

DBMS yazılım bir veritabanı oluşturmak, doldurmak, güncellemek ve silmek için.

Veritabanında saklanan bilgi birimi bir tablodur. Her tablo, satırların bir nesne örneğine, belirli bir olaya veya olguya karşılık geldiği ve sütunların nesnenin, olayın veya olgunun niteliklerine (özellikler, özellikler, parametreler) karşılık geldiği bir satırlar ve sütunlar koleksiyonudur. Her satır, belirli bir olay hakkında bilgi içerir.

Veritabanı terimlerinde, bir tablonun sütunlarına alan, satırlarına ise kayıt adı verilir.

Bireysel veri tabanı tabloları arasında ilişkiler olabilir, yani önceki tablodaki bilgiler diğerine eklenebilir. Bağlantıların olduğu ayrı tablolar arasındaki veritabanlarına ilişkisel denir. Aynı tablo, bir veritabanı tablosunun yöneticisi ve diğerinin alt öğesi olabilir.

İlişki tabloları bir ana-çocuk ilişkisinde etkileşime girer. Aynı tablo, bir veritabanı tablosunun yöneticisi ve diğerinin çocuğu olabilir.

Bir obje var olan ve ayırt edilebilen, bir takım özelliklere sahip olan bir şeydir. Bir nesne ile başka bir nesne arasındaki fark, belirli özellik değerleri tarafından belirlenir.

Öz - bir nesnenin bir kişinin veya bilgisayarın hafızasındaki yansıması.

Bağlanmak - varlığın özelliklerinden herhangi birinin belirli bir değeri.

Alan belirli bir öznitelik değerini depolayan tek girişli bir öğedir.

İletişim alanı iki tablonun ilişkilendirildiği alandır.

Birincil ve İkincil Anahtarlar

Her veritabanı tablosunun bir birincil anahtarı olabilir - bu, bir kaydı benzersiz şekilde tanımlayan bir alan veya alanlar kümesidir.

Veritabanı tablosundaki birincil anahtarın değeri benzersiz olmalıdır, yani tabloda aynı birincil anahtar değerine sahip iki veya daha fazla kayıt olmamalıdır.

Birincil anahtarlar, tablolar arasında ilişki kurmayı kolaylaştırır. Birincil anahtarın benzersiz olması gerektiğinden, tablodaki tüm alanlar onun için kullanılamaz.

Tabloda değerleri benzersiz olan alanlar yoksa, birincil anahtar oluşturmak için genellikle içine DBMS'nin kendi takdirine bağlı olarak elden çıkarabileceği ek bir sayısal alan eklenir.

İkincil anahtarlar, genellikle verileri ararken veya sıralarken kullanılan alana göre ayarlanır: ikincil anahtarlar üzerinde oluşturulan dizinler, sistemin ilgili alanlarda depolanan gerekli değerleri çok daha hızlı bulmasına yardımcı olur.

Birincil anahtarların aksine, ikincil anahtar alanları benzersiz olmayan bilgiler içerebilir.

Tablolar arasındaki ilişkisel ilişkiler

Bire bir. Üst tablodaki bir kayıt, alt tablodaki bir kayda karşılık geldiğinde bire bir ilişki vardır.

Bu ilişki, birden çoğa ilişkiden çok daha az yaygındır, veritabanı tablosunun ikincil tablodan şişmesini istemiyorsanız kullanılır. Bire bir ilişki, birden çok tablodaki ilgili bilgileri okumak için birden çok okuma yapılmasına neden olarak ihtiyacınız olan bilgilerin alınmasını yavaşlatır. Ayrıca birebir ilişki içeren tabloların yer aldığı veritabanları tam anlamıyla normalize edilmiş sayılmaz.

Bire çok ilişki gibi, bire bir ilişki de katı olabilir veya olmayabilir.

Çok önemli bir konuya - birincil ve yabancı anahtarlar - bu şekilde fark edilmeden yaklaştık. İlki hemen hemen herkes tarafından kullanılıyorsa, ikincisi bir nedenden dolayı göz ardı edilir. Ama boşuna. Yabancı anahtarlar sorun değil, veri bütünlüğünde gerçek bir yardımcıdır.

1.2.5. birincil anahtar

Anahtar alanlar hakkında zaten çok konuştuk, ancak bunları hiç kullanmadık. En ilginç şey, her şeyin işe yaramış olmasıdır. Bu, tabanın bir avantajı veya belki bir dezavantajıdır. Microsoft verileri SQL Server ve MS Erişimi. Paradox tablolarında bu hile çalışmayacak ve bir anahtar alan olmadan tablo salt okunur olacaktır.

Anahtarlar bir dereceye kadar kısıtlamalardır ve CHECK deyimi ile birlikte düşünülebilir çünkü bildirim benzer bir şekilde gerçekleşir ve hatta CONSTRAINT deyimi kullanılır. Bu süreci bir örnekle inceleyelim. Bunu yapmak için "guid" ve "vcName" olmak üzere iki alandan oluşan bir tablo oluşturacağız. Bu durumda, "guid" alanı birincil anahtar olarak ayarlanır:

CREATE TABLE Globally_Unique_Data (guid uniqueidentifier DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (Guid))

Buradaki en lezzetli şey CONSTRAINT satırıdır. Bildiğimiz gibi, bu anahtar kelimenin ardından kısıtlamanın adı gelir ve anahtar bildirimi de bir istisna değildir. Birincil anahtarı adlandırmak için PK_name kullanmanızı öneririm; burada ad, ana anahtar olması gereken alanın adıdır. PK kısaltması Birincil Anahtar'dan (birincil anahtar) gelir.

Bundan sonra ise constraintlerde kullandığımız CHECK anahtar sözcüğü yerine PRIMARY KEY deyimi gelir, bu da bir çeke değil, bir birincil anahtara ihtiyacımız olduğunu gösterir. Köşeli parantezler, anahtarı oluşturacak bir veya daha fazla alanı gösterir.

Bir anahtar alanın şunları içeremeyeceğini unutmayın: aynı değer iki sıra, bu bakımdan birincil anahtar kısıtlaması, benzersiz kısıtlama ile aynıdır. Bu, soyadını depolamak için alanı birincil anahtar yaparsanız, böyle bir tabloya farklı adlara sahip iki İvanov yazmak mümkün olmayacağı anlamına gelir. Bu, birincil anahtar kısıtlamasını ihlal eder. Bu nedenle anahtarlar kısıtlamalardır ve CHECK kısıtlaması ile aynı şekilde bildirilirler. Ancak bu yalnızca benzersiz olan birincil anahtarlar ve ikincil anahtarlar için geçerli değildir.

İÇİNDE bu örnek, birincil anahtar benzersiz tanımlayıcı (GUID) türünde bir alandır. Bu alan için varsayılan değer, NEWID sunucu prosedürünün yürütülmesinin sonucudur.

Dikkat

Bir tablo için yalnızca bir birincil anahtar oluşturulabilir

Örneklerin basitliği için, sayısal bir türün anahtar olarak kullanılması arzu edilir ve veritabanı izin veriyorsa, "otomatik artırma" türünde (otomatik olarak artan / azalan sayı) olması daha iyi olacaktır. MS SQL Server'da böyle bir alan KİMLİK'tir ve MS Access'te “sayaç” tipinde bir alandır.

Aşağıdaki örnek, birincil anahtar olarak otomatik artan bir tamsayı alanıyla bir ürün tablosunun nasıl oluşturulacağını gösterir:

TABLO OLUŞTUR Ürünler (id int KİMLİK(1, 1), ürün varchar(50), Fiyat para, Miktar sayısal(10, 2), CONSTRAINT PK_id BİRİNCİL ANAHTAR (id))

En sık kullanacağımız anahtar türüdür, çünkü okunması kolay olan sayılar anahtar alanında saklanacaktır ve bunlarla çalışmak daha kolay ve görseldir.

Birincil anahtar birden fazla sütun içerebilir. Aşağıdaki örnek, "id" ve "Product" alanlarının birincil anahtarı oluşturduğu bir tablo oluşturur; bu, her iki alanda da benzersiz bir dizin oluşturulacağı anlamına gelir:

CREATE TABLE Products1 (id int KİMLİK(1, 1), Ürün varchar(50), Fiyat para, Miktar sayısal(10, 2), CONSTRAINT PK_id PRİMER ANAHTAR (id, [Ürün adı]))

Çoğu zaman, programcılar bir tamsayı biçiminde bir anahtar alan içeren bir veritabanı oluşturur, ancak aynı zamanda görevde belirli alanların benzersiz olması gerektiği açıktır. Ve neden benzersiz olması gereken alanlardan hemen bir birincil anahtar oluşturmuyorsunuz ve bu sorun için ayrı çözümler oluşturmaya gerek kalmayacak.

Çok sütunlu bir birincil anahtarın tek dezavantajı, ilişki oluşturma sorunudur. Burada çeşitli yöntemlerle çıkmanız gerekiyor, ancak sorun hala çözülebilir. Uniqueidentifier türünde bir alana girmeniz ve bunun üzerinde bir bağlantı kurmanız yeterlidir. Evet, bu durumda, benzersiz bir birincil anahtar ve benzersiz tanımlayıcı türünde bir alan elde ederiz, ancak sonuç olarak bu fazlalık, birincil anahtarın benzersiz tanımlayıcı olduğu ve benzersiz olması gereken alanlarda benzersizlik kısıtlamalarının ayarlandığı aynı tablodan daha büyük olmayacaktır. Ne seçeceksin? Bu, belirli göreve ve neyle çalışmaktan daha rahat olduğunuza bağlıdır.

1.2.6. harici anahtar

Bir yabancı anahtar aynı zamanda bir KISITLAMA kısıtlamasıdır ve iki tablo arasındaki ilişkiyi temsil eder. Diyelim ki iki tablonuz var:

  • İsimler - kişilerin isimlerini içerir ve tanımlayıcı alanlar (anahtar alan), isimden oluşur.
  • Telefonlar, bir tanımlayıcı (anahtar alanı), adlar tablosuna bağlanmak için bir yabancı anahtar ve telefon numarasını saklamak için bir dizi alanından oluşan bir telefon tablosudur.

Bir kişinin birkaç telefonu olabilir, bu nedenle veri deposunu farklı tablolara ayırdık. Şekil 1.4, iki tablo arasındaki ilişkiyi görsel olarak göstermektedir. Daha önce bağlantılı tablolarla çalıştıysanız, bu sizin için yeterli olacaktır. Bağlantıları ilk kez duyuyorsanız, soruna daha yakından bakmaya çalışalım.

Örneğin üç kişilik bir masa ele alalım. Tablo 1.3, "Adlar" tablosunun içeriğini gösterir. Yalnızca üç satır vardır ve her birinin kendi benzersiz ana anahtarı vardır. Benzersizlik için, tabloyu oluşturduğumuzda, anahtarı otomatik olarak artan bir alan yapacağız.

Tablo 1.3 Adlar tablosunun içeriği

Tablo 1.4. Telefonlar tablosunun içeriği

Tablo 1.4 beş telefon numarası içerir. Ana anahtar alanında ayrıca, otomatik artırma da yapılabilen benzersiz bir ana anahtar bulunur. İkincil anahtar, Adlar tablosunun birincil anahtarıyla bir ilişkidir. Bu bağlantı nasıl çalışır? Petrov, İsimler tablosunda ana anahtar olarak 1 numaraya sahiptir.Telefonlar tablosunda, ikincil anahtardaki 1 numarayı arar ve Petrov'un telefon numaralarını alırız. Aynı şey girişlerin geri kalanı için de geçerli. Görsel olarak, bağlantı Şekil 1.5'te görülebilir.

Bu tür veri depolama çok uygundur. Bağlantılı tablolar oluşturmak mümkün olmasaydı, Adlar tablosunda tüm telefon numaralarını tek bir alana doldurmamız gerekirdi. Bu kullanım, destek ve veri alma açısından elverişsizdir.

Bir tabloda birden çok Ad alanı oluşturabilirsiniz, ancak soru kaç tane olduğudur. Bir kişinin yalnızca 1 telefonu olabilir ve örneğin çalışanları saymazsak bende 3 tane var. Çok sayıda alan veri fazlalığına yol açar.

İsimler tablosundaki her telefon için soyadı ile ayrı bir satırın olması mümkündür ancak bu sadece bunun için kolaydır. basit bir örnek sadece soyadını girmeniz gerektiğinde ve birkaç telefon numarasıyla Petrov için kolayca birkaç giriş yapabilirsiniz. Ve 10 veya 20 alan varsa? Böylece, yabancı bir anahtarla bağlanan iki tablonun oluşturulması liste 1.6'da görülebilir.

Listeleme 1.6. Yabancı bir anahtarla bağlantılı tablolar oluşturma

CREATE TABLE Adlar (idName int IDENTITY(1,1), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName),)) ) REFERANSLAR Adlar (idName))

Listenin içeriğini dikkatlice okuyun. Yeterince ilginç çünkü daha önce ele aldığımız bazı operatörleri kullanıyor ve fazladan bir örnek iyi olurdu. Her iki tablo için de önce gelen, int türünde bir anahtar alan oluşturulur ve 1'den itibaren otomatik olarak birer birer artar. Anahtar alanı, bir CONSTRAINT kısıtlamasıyla ana anahtar yapılır.

Telefonlar tablosunun açıklamasında son satır bizim için yeni bir bildirim, yani FOREIGN KEY operatörünü kullanan bir yabancı anahtarın bildirimini içerir. Gördüğünüz gibi bu da bir sınırlama ve nedenini biraz sonra anlayacaksınız. Köşeli parantezler, başka bir tabloya bağlanması gereken tablo alanını gösterir. Bunu REFERENCES (referans) anahtar sözcüğü, ilişkinin olması gereken tablonun adı (Adlar) ve parantez içinde alanın adı ("idName") takip eder. Böylece, Şekil 1.4'te gösterilen bir bağlantı kurduk.

Dikkat!

Bir yabancı anahtar, yalnızca başka bir tablonun birincil anahtarına veya benzersiz bir kısıtlamaya atıfta bulunabilir. Bu, REFERENCES anahtar kelimesinin ardından tablo adının gelmesi gerektiği ve parantez içinde yalnızca birincil anahtarın veya UNIQUE kısıtlaması olan bir alanın belirtilebileceği anlamına gelir. Diğer alanlar belirtilemez.

Şimdi, tabloları verilerle doldurabilirseniz. Aşağıdaki üç komut tablo 1.3'te gördüğümüz üç soyadını ekler:

INSERT INTO Adlar(vcName) DEĞERLER("Petrov") INTO INTO Adlar(vcName) DEĞERLER("Ivanov") INSERT INTO Adlar(vcName) DEĞERLER("Sidorov")

Halihazırda SQL ile çalıştıysanız, telefon tablosu için de girişler ekleyebilirsiniz. Bu komutları atlayacağım ama bunları CD'deki Chapter1 dizininde foreign_keys.sql dosyasında görebilirsiniz.

Şimdi görevimiz, bir yabancı anahtarın kısıtlayıcı eylemlerinin ne olduğunu görmek, hadi çözelim. İki alan arasında açık bir ilişki olduğunu farklı tablolarda belirttik. Soyadlı tabloda aynı isim alanında olmayan (isim farklı yapılmış olabilir) "idName" alanına tanıtıcı ile telefon tablosuna kayıt eklemeye çalışırsanız hata oluşur. Bu, iki tablo arasındaki ilişkiyi bozacak ve yabancı anahtar kısıtlaması, ilişkisiz kayıtların var olmasını engelleyecektir.

Kısıtlama, kayıtları değiştirirken veya silerken de geçerlidir. Örneğin Petrov soyadına sahip satırı silmeye çalışırsanız, foreign key constraint hatası alırsınız. Harici olarak ilişkili satırlara sahip kayıtları silemezsiniz. Öncelikle bu giriş için tüm telefonları silmeniz gerekiyor ve ancak bundan sonra Petrov adıyla hattın kendisini silmek mümkün olacak.

Yabancı anahtar oluşturma sırasında ON DELETE CASCADE veya ON UPDATE CASCADE belirtilebilir. Bu durumda, Petrov kaydını Adlar tablosundan silerseniz veya tanımlayıcıyı değiştirirseniz, Petrov satırıyla ilişkili Telefonlar tablosundaki tüm kayıtlar otomatik olarak güncellenecektir. Asla. Hayır, büyük harflerle yazmanız gerekir: Bunu ASLA yapmayın. Her şey manuel olarak kaldırılmalı veya değiştirilmelidir. Kullanıcı yanlışlıkla İsimler tablosundan bir girişi silerse ilgili telefonlar da silinecektir. Kısıtlayıcı gücünün yarısı ortadan kalkarsa, bir yabancı anahtar oluşturmak mantıklıdır! Her şey yalnızca manuel olarak yapılmalıdır ve tanımlayıcıların değiştirilmesi kesinlikle önerilmez.

Tabloların silinmesi de alt tabloyla, yani Telefonlarla başlamalıdır ve ancak o zaman ana Adlar tablosu silinebilir.

Son olarak, iki tablodaki isimleri ve telefon numaralarını nasıl güzel bir şekilde eşleştireceğinizi göstereceğim:

Names.idName=Phones.idName NEREDE Adlar, Telefonlardan vcName, vcPhone SEÇİN

Bölüm 2'de bu tür sorgular hakkında daha fazla konuşacağız. Şimdilik, size sadece bağlantılı tabloların gücünü göstermek için bir örnek ekledim.

Bir tablo, en karmaşık veritabanları için bile yeterli olan 253 adede kadar yabancı anahtar içerebilir. Şahsen, tablo başına yabancı anahtar sayısının 7'yi geçmediği veritabanlarıyla çalışmak zorunda kaldım. Daha fazlaysa, istisnalar olmasına rağmen büyük olasılıkla veritabanı yanlış tasarlanmıştır.

Tablonun kendisi de en fazla 253 yabancı anahtar içerebilir. Bir tablodaki yabancı anahtarlar daha az yaygındır, çoğunlukla 3'ten fazla değildir. Çoğu zaman, bir tablonun diğer tablolara birçok bağlantısı olabilir.

Bir yabancı anahtar, oluşturulduğu aynı tabloya başvurabilir. Örneğin, tablo 1.5'te gösterildiği gibi bir kuruluştaki pozisyonlar tablonuz var. Tablo üç alandan oluşur: birincil anahtar, yabancı anahtar ve iş unvanı. Herhangi bir organizasyonda birçok pozisyon olabilir, ancak bunların isimlerini ve alt yapılarını tek bir tabloda göstermek oldukça mantıklı olacaktır. Bunu yapmak için yabancı anahtar, iş tablosunun birincil anahtarıyla ilişkilendirilmelidir.

Tablo 1.5. Dahili bağlantı içeren tablo

Sonuç olarak, CEO'nun sıfır yabancı anahtarı olduğunu anlıyoruz, yani. bu pozisyon diğerlerinin başındadır. Ticari direktör ve genel işler müdürü için yabancı anahtar, genel müdürün sırasını işaret eder. Bu, bu iki pozisyonun doğrudan CEO'ya. Ve benzeri.

Tüm bunları bir SQL sorgusu biçiminde nasıl oluşturabileceğimize bakalım:

CREATE TABLE Pozisyonlar (idPosition int IDENTITY(1,1), idParentPosition int, vcName varchar(30), CONSTRAINT PK_idPosition PRIMARY KEY (idPosition), CONSTRAINT FK_idParentPosition YABANCI ANAHTAR (idParentPosition) REFERANSLAR Pozisyonlar (idPosition))

Gördüğünüz gibi, yabancı anahtar basitçe oluşturduğumuz aynı tabloyu ifade ediyor. CD'de, Chapter1 dizininde, foreign_keys_to_self.sql dosyasında bu tabloyu oluşturmanın, tabloyu verilerle doldurmanın ve sıralamalarını dikkate alarak konumları görüntülemenin bir örneğini görebilirsiniz. Bir sonraki bölümde, bu tür tablolarla çalışma olasılığına daha ayrıntılı olarak bakacağız.

bire bir ilişki

Şimdiye kadar, ana veri tablosunun bir satırının ilişkili tablodan bir satıra karşılık geldiği klasik ilişkiyi ele aldık. Böyle bir ilişkiye bire çok denir. Ancak başka ilişkiler de var ve şimdi bir başkasını ele alacağız - bire bir, ana tablodaki bir kayıt diğerindeki bir kayıtla ilişkili olduğunda. Bunu uygulamak için her iki tablonun birincil anahtarlarını birbirine bağlamak yeterlidir. Birincil anahtarlar tekrar edilemediğinden, her iki tabloda yalnızca bir satır ilişkilendirilebilir.

Aşağıdaki örnek, birincil anahtarlar arasında ilişki olan iki tablo oluşturur:

CREATE TABLE Telefonlar (idPhone uniqueidentifier DEFAULT NEWID(), vcPhone varchar(10), CONSTRAINT PK_idPhone PRIMARY KEY (idPhone), CONSTRAINT FK_idPhone FOREIGN KEY (idPhone) REFERENCE S-Adları (idName))

Tablolardan yalnızca biri yabancı anahtara ihtiyaç duyar. İlişki bire bir olduğu için hangi tabloda oluşturulacağı önemli değildir.

çoktan çoğa

En karmaşık ilişki, bir tablodaki birçok kaydın başka bir tablodaki birçok kayıtla eşleştiği çoktan çoğa ilişkidir. Bunu gerçekleştirmek için iki tablo yetmez, üç tabloya ihtiyaç vardır.

Öncelikle çoktan çoğa ilişkinin ne zaman kullanılabileceğini anlamanız gerekir? Diyelim ki iki tablonuz var: evde oturanların listesi ve telefon numaralarının listesi. Bir apartmanda birden fazla numara olabilir yani iki telefon aynı isme ait olabilir. Yani bu bire çok ilişki. Öte yandan, bir dairede iki aile olabilir (ortak apartman dairesi veya sadece sahibinin telefonunu kullanan bir kiracı), bu da telefon ile konut sakini arasındaki ilişkinin de birden çoğa olduğu anlamına gelir. Ve en zor seçenek, ortak bir dairede iki telefona sahip olmaktır. Bu durumda, apartmanın birkaç sakini her iki numarayı da kullanır. Böylece, "birçok" ailenin "birçok" telefonu kullanabileceği (çoktan çoğa iletişim) ortaya çıktı.

Çoktan çoğa bir ilişki nasıl uygulanır? İlk bakışta, ilişkisel modelde bu imkansızdır. 10 yıl önce arıyordum farklı değişkenler ve sonuç olarak, veri fazlalığıyla dolup taşan bir tablo oluşturdu. Ancak bir gün, bir görevim var, bu sayede mükemmel bir çözüm zaten durumdan yüzeye çıktı - iki apartman sakini ve telefon tablosu oluşturmanız ve bunlara yalnızca birincil anahtarı uygulamanız gerekiyor. Bu tabloda yabancı anahtarlara gerek yoktur. Ve burada tablolar arasındaki iletişim üçüncü, bağlantı tablosu aracılığıyla olmak zorundadır. İlk bakışta bu zor ve net değil ama bu yöntemi anladığınızda bu çözümün tüm gücünü göreceksiniz.

Tablo 1.6 ve 1.7 sırasıyla soyadı ve telefon tablosu örneklerini göstermektedir. Ve tablo 1.8 bir bağlantı tablosunu göstermektedir.

Tablo 1.6. Soyadı tablosu

Tablo 1.7. Telefon masası

Tablo 1.8. Telefon masası

Şimdi çoktan çoğa ilişkide veri arama mantığının nasıl olacağını görelim. Diyelim ki Ivanov'a ait tüm telefonları bulmamız gerekiyor. Ivanov'un birincil anahtarı 1'e eşit. Bağlantı tablosunda "Adla ilişki" alanı 1'e eşit olan tüm kayıtları buluyoruz. Bunlar 1 ve 2 numaralı kayıtlar olacaktır. Bu kayıtlarda, "Telefonla bağlantı" alanında sırasıyla 1 ve 2 tanımlayıcıları vardır, bu da Ivanov'un telefon tablosundaki 1 ve 2. satırlarda bulunan numaraların sahibi olduğu anlamına gelir.

Şimdi ters problemi çözelim - 567575677 telefon numarasına kimin erişebileceğini belirleyin. Telefon tablosundaki bu numaranın anahtarı 3'tür. "Telefona bağlantı" alanının 3 olduğu bağlantı tablosundaki tüm kayıtları arıyoruz. Bunlar, "Ad bağlantısı" alanında sırasıyla 2 ve 3 değerlerini içeren 4 ve 5 numaralı kayıtlardır. Şimdi soyad tablosuna bakarsanız, 2 ve 3 numaralarının altında Petrov ve Sidorov'u göreceksiniz. Yani, 567575677 numaralı telefonu kullananlar bu iki kişidir.

Üç tabloyu da gözden geçirin ve hangi telefon numaralarının hangi konut sakinlerine ait olduğunu veya tam tersini anladığınızdan emin olun. Bu bağlantıyı görürseniz üç kuruş kadar basit olduğunu anlayacak ve projelerinizde hızlıca uygulayabileceksiniz.

CREATE TABLE İsimler (idName uniqueidentifier DEFAULT NEWID(), vcName varchar(50), CONSTRAINT PK_guid PRIMARY KEY (idName)) CREATE TABLE Telefonlar (idPhone uniqueidentifier DEFAULT NEWID(), vcPhone varchar(10), CONSTRAINT PK_idPhone PRIMARY KEY (idPhone)) (), idName uniqueidentifier, idPhone uniqueidentifier, CONSTRAINT PK_idLinkT PRİMER ANAHTAR (idLinkTable), CONSTRAINT FK_idPhone YABANCI ANAHTAR (idPhone) REFERANSLAR Telefonlar (idPhone), CONSTRAINT FK_idName YABANCI ANAHTAR (idName) REFERANSLAR Adlar (idName))

Bağlantı tablosu, ad ve telefon tablolarına bağlanan iki yabancı anahtara ve kayıtları benzersiz kılan bir birincil anahtara sahiptir.

Bu belirli görevi çözmek için daha uygun olduğu için GUID alanını birincil anahtar olarak seçtim. Mesele şu ki, kayıtları iki tabloya yerleştirmemiz gerekiyor ve her iki durumda da aynı anahtarı belirtmek gerekiyor. GUID değeri oluşturulabilir ve ardından her iki tabloya da veri eklenirken kullanılabilir.

Anahtar olarak bir otomatik artırma alanı da kullanabilirsiniz ancak bu durumda sorunu çözmek biraz daha zordur, daha doğrusu sorunu çözmek zahmetlidir. Örneğin, bir telefon numarası eklerken, önce ilgili satırı tabloya eklemeniz, ardından bulmanız, satıra atanan anahtarı belirlemeniz ve ardından bağlantı kurmanız gerekir.

Bu aşamada, sadece tablo oluşturmakla sınırlıyız ve bölüm 2.8'de bu konuya geri döneceğiz ve ilgili tablolarla nasıl çalışılacağını öğreneceğiz ve öğreneceğiz. Bire bir ve bire çok ilişkilerle çalışmak çok farklı değil çünkü bu şemada yalnızca iki tablo yer alıyor. Çoktan çoğa ilişki, birleştirme tablosu nedeniyle biraz daha karmaşıktır, bu nedenle Bölüm 2.27'de ayrı olarak ele alacağız.

Son güncelleme: 27/04/2019

Yabancı anahtarlar, tablolar arasında ilişki kurmanıza izin verir. Bir yabancı anahtar bağımlı, alt tablodaki sütunlara ayarlanır ve ana tablodaki sütunlardan birine işaret eder. Tipik olarak, bir yabancı anahtar, ilgili bir ana tablodan bir birincil anahtarı işaret eder.

Tablo düzeyinde bir yabancı anahtar ayarlamak için genel sözdizimi şöyledir:

YABANCI ANAHTAR (sütun1, sütun2, ... sütunN) REFERANSLAR master_table (sütun_ana_tablo1, sütun_ana_tablo2, ... sütun_ana_tabloN)

Bir yabancı anahtar kısıtlaması oluşturmak için, YABANCI ANAHTAR'ı, yabancı anahtarı temsil edecek tablo sütunu takip eder. REFERENCES anahtar sözcüğünü ilgili tablonun adı ve ardından yabancı anahtarın işaret edeceği parantez içinde ilgili sütunun adı takip eder. REFERENCES ifadesini sırasıyla ana tablodan bir satır silindiğinde ve güncellendiğinde yapılacak eylemi tanımlayan ON DELETE ve ON UPDATE ifadeleri takip eder.

Örneğin, iki tablo tanımlayalım ve bunları bir yabancı anahtarla ilişkilendirelim:

CREATE TABLE Müşteriler (Id INT PRIMARY KEY AUTO_INCREMENT, Age INT, Ad VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL, Phone VARCHAR(20) NOT NULL UNIQUE); TABLO OLUŞTURMA Emirleri(Id INT PRİMER ANAHTAR AUTO_INCREMENT, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR(CustomerId) REFERANSLAR Müşteriler(Id));

Bu durumda Müşteriler ve Siparişler tabloları tanımlanır. Müşteri esastır ve müşteriyi temsil eder. Siparişler bağımlıdır ve müşteri tarafından verilen siparişi temsil eder. Siparişler tablosu, CustomerId sütunu aracılığıyla Customers tablosuna ve onun Id sütununa bağlanır. Yani CustomerId sütunu, Customers tablosundan Id sütununa işaret eden bir yabancı anahtardır.

CONSTRAINT deyimini kullanarak, bir yabancı anahtar kısıtlaması için bir ad belirleyebilirsiniz:

OLUŞTUR TABLO Siparişleri (Id INT BİRİNCİL ANAHTAR AUTO_INCREMENT, CustomerId INT, CreatedAt Date, CONSTRAINT order_custonmers_fk YABANCI ANAHTAR (CustomerId) REFERENCES Müşteriler (Id));

SİLME ÜZERİNE ve GÜNCELLEME ÜZERİNE

ON DELETE ve ON UPDATE deyimlerini kullanarak ana tablodan ilgili satır silindiğinde ve güncellendiğinde sırasıyla yapılacak işlemleri belirleyebilirsiniz. Aşağıdaki seçenekler bir eylem olarak kullanılabilir:

    CASCADE : Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablodaki satırları otomatik olarak siler veya değiştirir.

    SET NULL : Ana tablodan ilgili bir satırı silerken veya güncellerken, yabancı anahtar sütununu NULL olarak ayarlar. (Bu durumda, yabancı anahtar sütunu NULL ayarını desteklemelidir)

    RESTRICT : Bağımlı tabloda ilgili satırlar varsa, ana tablodaki satırların silinmesini veya değiştirilmesini reddeder.

    EYLEM YOK : RESTRICT ile aynı.

    VARSAYILAN AYARLA : Ana tablodan ilgili bir satırı silerken, yabancı anahtar sütununu, DEFAULT öznitelikleri kullanılarak ayarlanan varsayılan değerine ayarlar. Bu seçenek ilke olarak mevcut olsa da, InnoDB motoru bu ifadeyi desteklemez.

Basamaklı silme

Basamaklı silme, ana tablodan bir satırı sildiğinizde, ilgili tüm satırları bağımlı tablodan otomatik olarak silmenizi sağlar. Bunu yapmak için CASCADE seçeneğini kullanın:

TABLO OLUŞTURMA Emirleri (Id INT PRİMER ANAHTAR AUTO_INCREMENT, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) ON DELETE CASCADE);

ON UPDATE CASCADE ifadesi benzer şekilde çalışır. Birincil anahtarın değerinin değiştirilmesi, ilişkili yabancı anahtarın değerini otomatik olarak değiştirecektir. Bununla birlikte, birincil anahtarlar çok nadiren değiştiğinden ve değişken değerlere sahip sütunların birincil anahtar olarak kullanılması genellikle önerilmediğinden, pratikte ON UPDATE ifadesi nadiren kullanılır.

BOŞ ayarı

Yabancı anahtarın SET NULL olarak ayarlanması, yabancı anahtar sütununun null yapılabilir olmasını gerektirir:

TABLO OLUŞTUR Emirleri (Id INT PRİMER ANAHTAR AUTO_INCREMENT, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) ON SİLME SET NULL);

Son güncelleme: 07/09/2017

Yabancı anahtarlar, tablolar arasında ilişki kurmak için kullanılır. Bir yabancı anahtar bağımlı, alt tablodaki sütunlara ayarlanır ve ana tablodaki sütunlardan birine işaret eder. Kural olarak, bir yabancı anahtar, ilişkili ana tablodaki bir birincil anahtarı işaret etse de, bunun olmazsa olmaz olması gerekmez. Yabancı anahtar, benzersiz bir değere sahip başka bir sütuna da işaret edebilir.

Sütun düzeyinde bir yabancı anahtar ayarlamak için genel sözdizimi şöyledir:

REFERANSLAR main_table (column_main_table)

Sütun düzeyinde bir yabancı anahtar kısıtlaması oluşturmak için, REFERENCES anahtar sözcüğünü ilgili tablonun adı ve parantez içinde yabancı anahtarın işaret edeceği ilgili sütunun adı takip eder. Ayrıca genellikle eklenir anahtar kelimeler YABANCI ANAHTAR , ancak prensipte bunları belirtmek gerekli değildir. REFERENCES ifadesinden sonra ON DELETE ve ON UPDATE ifadesi gelir.

Tablo düzeyinde bir yabancı anahtar ayarlamak için genel sözdizimi şöyledir:

YABANCI ANAHTAR (sütun1, sütun2, ... sütunN) REFERANSLAR main_table (main_table_column1, main_table_column2, ... main_table_column)

Örneğin, iki tablo tanımlayalım ve bunları bir yabancı anahtarla ilişkilendirelim:

CREATE TABLE Müşteriler (Kimlik INT BİRİNCİL ANAHTAR KİMLİK, Yaş INT DEFAULT 18, Ad NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE); CREATE TABLE Siparişleri(Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT REFERENCES Customers(Id), CreatedAt Date);

Müşteriler ve Siparişler tabloları burada tanımlanır. Müşteri esastır ve müşteriyi temsil eder. Siparişler bağımlıdır ve müşteri tarafından verilen siparişi temsil eder. Bu tablo, CustomerId sütunu aracılığıyla Customers tablosuna ve onun Id sütununa bağlanır. Yani CustomerId sütunu, Customers tablosundan Id sütununa işaret eden bir yabancı anahtardır.

Tablo düzeyinde bir yabancı anahtar tanımı şuna benzer:

CREATE TABLE Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id));

Bir yabancı anahtar kısıtlaması için bir ad belirtmek üzere CONSTRAINT deyimini kullanabilirsiniz. Genellikle bu ad "FK_" önekiyle başlar:

CREATE TABLE Emirleri (Id INT PRİMER ANAHTAR KİMLİK, CustomerId INT, CreatedAt Date, CONSTRAINT FK_Orders_To_Customers YABANCI ANAHTAR (CustomerId) REFERENCES Müşteriler (Id));

Bu durumda, CustomerId yabancı anahtar kısıtlaması "FK_Orders_To_Customers" olarak adlandırılır.

SİLME ÜZERİNE ve GÜNCELLEME ÜZERİNE

ON DELETE ve ON UPDATE deyimlerini kullanarak ilgili satır ana tablodan silindiğinde ve güncellendiğinde sırasıyla yapılacak işlemleri belirleyebilirsiniz. Ve bir eylemi tanımlamak için aşağıdaki seçenekleri kullanabiliriz:

    CASCADE : Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablodaki satırları otomatik olarak siler veya değiştirir.

    EYLEM YOK : Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablo üzerinde herhangi bir işlem yapılmasını önler. Yani, aslında hiçbir eylem yoktur.

    NULL SET : Ana tablodan ilgili bir satırı silerken, yabancı anahtar sütununu NULL olarak ayarlar.

    VARSAYILAN AYARLA : Ana tablodan ilgili bir satırı silerken, yabancı anahtar sütununu, DEFAULT öznitelikleri kullanılarak ayarlanan varsayılan değerine ayarlar. Bir sütunun varsayılan değeri yoksa, sütun değeri olarak NULL kullanılır.

Basamaklı silme

Varsayılan olarak, bağımlı tablodaki herhangi bir satır, ana tablodaki bir satıra yabancı anahtarla başvuruyorsa, bu satırı ana tablodan silemeyeceğiz. İlk olarak, bağımlı tablodaki ilgili tüm satırları kaldırmamız gerekecek. Ve ana tablodan bir satırı silerken, bağımlı tablodaki ilgili tüm satırların silinmesi gerekiyorsa, kademeli silme, yani CASCADE seçeneği uygulanır:

TABLO OLUŞTURMA Emirleri (Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) DELETE CASCADE'DE)

ON UPDATE CASCADE ifadesi benzer şekilde çalışır. Birincil anahtarın değerinin değiştirilmesi, ilişkili yabancı anahtarın değerini otomatik olarak değiştirecektir. Ancak birincil anahtarlar çok nadiren değişme eğiliminde olduğundan ve değişken değerlere sahip sütunların birincil anahtar olarak kullanılması genellikle önerilmediğinden, pratikte ON UPDATE ifadesi nadiren kullanılır.

BOŞ ayarı

Yabancı anahtarın SET NULL olarak ayarlanması, yabancı anahtar sütununun null yapılabilir olmasını gerektirir:

OLUŞTUR TABLO Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) ON DELETE SET NULL);

Varsayılan değerin ayarlanması

OLUŞTUR TABLO Emirleri (Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) AÇIK SİLME VARSAYILAN AYARLA)