SQL xorijiy kalit qoidalari. Chet el kalitlari FOREIGN KEY. Tabiiy va surrogat kaliti

Ular har qanday faoliyatda qo'llaniladi: bank va moliya sohalarida, sayyohlik biznesida, omborlarda, ishlab chiqarish va o'qitishda. Ular jadvallar to'plami, aniq xususiyatlarga ega va qat'iy talablarga bo'ysunadi. Relyatsion ma'lumotlar bazalarida jadvallar munosabatlar deyiladi.

Ma'lumotlar bazasida asosiy kalit nima?

Ma'lumotlar bazasida jadvalning asosiy kaliti uning ustunlaridan biridir (Asosiy kalit). Keling, qanday ko'rinishini misol bilan ko'rib chiqaylik. Universitet talabalarining oddiy munosabatlarini tasavvur qiling (buni "Talabalar" deb ataymiz).

Biz talabani bitta ustun bo'yicha noyob tarzda aniqlashimiz kerak. Buning uchun har bir yozuv uchun ushbu ustundagi ma'lumotlar noyob bo'lishi kerak. Ammo bu borada mavjud ma'lumotlar bizni yozuvni aniq belgilashga imkon bermaydi, chunki familiyalar, ismlar va familiyalari bir xil bo'lgan talabalar bitta kursda va bitta fakultetda o'qishi mumkin. Ma'lumotlar bazasidagi birlamchi kalit munosabatlardagi kerakli qatorni aniq aniqlash uchun ishlatiladi. Ko'pincha, bu hajmda raqamli maydon ishlatiladi, bu yozuvni kiritish bilan avtomatik ravishda ko'payadi (identifikatorning avtomatik ortib boruvchi ustuni).

Oddiy va kompozit asosiy kalit

Birlamchi kalit oddiy yoki murakkab bo'lishi mumkin. Agar yozuvning o'ziga xosligi yuqorida tavsiflanganidek, faqat bitta sohadagi qiymat bilan aniqlansa, biz oddiy kalit bilan ish yuritamiz. Kompozit kalit bu ikki yoki undan ortiq maydonlardan iborat ma'lumotlar bazasining asosiy kalitidir. Bank mijozlarining quyidagi munosabatini ko'rib chiqing.

TO'LIQ ISMI SHARIF. Tug'ilgan kun Pasport seriyasi Pasport raqami
Ivanov P.A. 12.05.1996 75 0553009
Sergeev V.T. 14.07.1958 71 4100654
L.V.Krasnov 22.01.2001 73 1265165

Odamlarning pasportlarida bir xil seriya yoki raqamlar bo'lishi mumkin, ammo bir xil seriya va raqamlar kombinatsiyasiga ega pasportlar mavjud emas. Shunday qilib, "Pasport seriyasi" va "Pasport raqami" maydonlari shaxsni o'ziga xos ravishda identifikatsiya qiladigan ko'rsatilgan munosabatlarning tarkibiy kalitiga aylanadi.

O'zaro aloqalar

Shunday qilib, ma'lumotlar bazasidagi asosiy kalit ushbu munosabatlarning qatorini noyob ravishda aniqlashga imkon beradigan jadvalning bir yoki bir nechta ustunlari. Bu nima uchun?

"Talabalar" munosabatlari bilan birinchi misolga qaytaylik. Ushbu munosabatlarga qo'shimcha ravishda ma'lumotlar bazasida boshqa ma'lumotlar saqlanadi, masalan, har bir talabaning taraqqiyoti. Ma'lumotlar bazasida mavjud bo'lgan barcha ma'lumotlarni takrorlamaslik uchun ular kerakli yozuvga ishora qiluvchi kalitdan foydalanadilar. Bunga o'xshaydi.

Misolning ikkita munosabatlarida biz ID maydonini ko'ramiz. Ushbu jadvallar uchun ma'lumotlar bazasidagi asosiy kalitlar. Ko'rib turganingizdek, taraqqiyot faqat ushbu jadvallarga boshqa jadvallardan havolalarni o'z ichiga oladi, ulardagi barcha ma'lumotlarni ko'rsatmasdan.

Tabiiy va surrogat kaliti

Ma'lumotlar bazasi jadvalining asosiy kaliti qanday aniqlanadi? Biz ko'rib chiqqan ikkita misol - "Talabalar" va "Bank mijozlari" tabiiy va surrogat kalitlari tushunchalarini aks ettiradi. Bank mijozlari jadvalida biz mavjud ustunlardan foydalangan holda "Raqam" va "Pasport seriyalari" maydonlaridan iborat kalitni aniqladik. Bunday kalit tabiiy deb nomlanadi; biz uni aniqlash uchun hech qanday o'zgartirish yoki qo'shimchalar kiritmadik. "Talabalar" munosabati bilan bog'liq holda, hech bir maydon yoki maydonlarning kombinatsiyasi bizga o'ziga xoslikni bermadi. Bu bizni talaba kodi bilan qo'shimcha maydonga kirishga majbur qildi. Bunday kalit surrogat kalit deb ataladi, buning uchun biz jadvalga yana bitta xizmat ustunini qo'shdik. Ushbu ustun hech qanday foydali ma'lumotlarni o'z ichiga olmaydi va faqat yozuvlarni aniqlashga xizmat qiladi.

Ma'lumotlar bazasidagi xorijiy kalit va ma'lumotlar yaxlitligi

Yuqorida aytilganlarning barchasi bizni chet el kalitlari va ma'lumotlar bazasining yaxlitligiga olib keladi. Tashqi kalit - bu tashqi aloqaning Boshlang'ich kalitiga ishora qiluvchi maydon. Baholar jadvalida bular "Talaba" va "Intizom" ustunlari. Ularning ma'lumotlari bizni tashqi jadvallarga ishora qiladi. Ya'ni, "Ishlash" munosabatlaridagi "Talaba" maydoni chet el kalitidir va "Talaba" munosabatlarida ma'lumotlar bazasidagi asosiy kalit hisoblanadi.

Ma'lumotlar bazalarini yaratishning muhim printsipi ularning yaxlitligidir. Va uning qoidalaridan biri bu bog'lanishning yaxlitligi. Bu shuni anglatadiki, jadvalning tashqi kaliti boshqa munosabatlarning mavjud bo'lmagan asosiy kalitiga murojaat qila olmaydi. Siz "Kod" bilan yozishni o'chira olmaysiz - Ivanov Ivan "Talaba" munosabatlaridan, agar u jadval jadvalidagi yozuvga ishora qilsa. To'g'ri qurilgan ma'lumotlar bazasida, o'chirishga urinishda ushbu maydon ishlatilayotganligi haqida xato paydo bo'ladi.

Butunlik qoidalarining boshqa guruhlari, shuningdek ma'lumotlar bazasining boshqa cheklovlari mavjud, ular ham diqqatga sazovordir va ishlab chiquvchilar tomonidan ko'rib chiqilishi kerak.

Chet el kaliti havolalarni cheklash uchun ishlatiladi.
Jadvalning bitta maydonidagi barcha qiymatlar boshqa jadvalning maydonida ifodalanganida, birinchi maydon ikkinchisiga tegishli deb aytiladi. Bu ikki maydon qiymatlari o'rtasidagi to'g'ridan-to'g'ri bog'liqlikni ko'rsatadi.

Jadvaldagi bir jins boshqasiga murojaat qilsa, u deyiladi tashqi kalit; va unga tegishli maydon deyiladi asosiy kalit... Chet el kalitlari va ota-ona kalitlari nomlari bir xil bo'lishi shart emas. Chet el kalitida har qanday sonli maydon bo'lishi mumkin, ularning barchasi bitta modul sifatida ko'rib chiqiladi. Tashqi kalit va u aytadigan ota kalit bir xil maydon raqami va turiga ega bo'lishi va bir xil tartibda bo'lishi kerak. Maydon tashqi kalit bo'lsa, u qandaydir tarzda u murojaat qilgan jadval bilan bog'lanadi. Chet el kalitining har bir qiymati, (har bir satri) asosiy kalitning bitta va bitta qiymatiga (satriga) aniq murojaat qilishi kerak. Agar ushbu shart bajarilsa, ma'lumotlar bazasi holatidadir ma'lumotnoma yaxlitligi.

SQL cheklangan havola yaxlitligini saqlaydi Chet el kaliti... Ushbu funktsiya ma'lumotlar bazasiga kiritilishi mumkin bo'lgan qiymatlarni cheklashi kerak, bu tashqi kalit va asosiy kalitni mos yozuvlar yaxlitligi printsipiga mos kelishiga majbur qiladi. Cheklov harakatlaridan biri Chet el kaliti hali asosiy kalitda ko'rsatilmagan tashqi kalit sifatida cheklangan maydonlar uchun qiymatlarni tushiradi. Ushbu cheklash, shuningdek, ota-ona kalit qiymatlarini o'zgartirish yoki o'chirish qobiliyatiga ta'sir qiladi.

Cheklov Chet el kaliti chet el tugmachasi deb e'lon qilingan maydonni o'z ichiga olgan CREATE TABLE (yoki ALTER TABLE (jadval tuzilishini o'zgartirish uchun mo'ljallangan) buyrug'ida ishlatiladi. Ota-ona kalitiga cheklov ichida havola qilingan ism beriladi Chet el kaliti.

Ko'pgina cheklovlar singari, bu jadval shaklida yoki ustun cheklovi bo'lishi mumkin, bu jadval shaklida, bir nechta maydonlarni bitta tashqi kalit sifatida ishlatishga imkon beradi.

Jadval cheklash sintaksis Chet el kaliti:

Chet el kaliti ADABIYOTLAR

[ ]

Birinchi ustunlar ro'yxati - bu buyruq bilan tuzilgan yoki o'zgartirilgan jadvaldagi bir yoki bir nechta ustunlarning vergul bilan ajratilgan ro'yxati.

Pktable bu ota-ona kalitini o'z ichiga olgan jadval. Bu joriy buyruq bilan tuzilgan yoki o'zgartirilgan jadval bo'lishi mumkin.

Ikkinchi ustunlar ro'yxati - bu asosiy kalitni tashkil etadigan ustunlar ro'yxati. Ikkala ustunning ro'yxatlari mos kelishi kerak, ya'ni:

  • bir xil sonli ustunlarga ega bo'lish
  • berilgan ketma-ketlikda, chet el kalitlari ustunlari ro'yxatining ustunlari birinchi, ikkinchi, uchinchi va hk., asosiy kalit ustunlar ro'yxatining birinchi, ikkinchi, uchinchi va boshqalar ustunlari bilan bir xil ma'lumotlar turlari va o'lchamlarga ega bo'lishi kerak.
  • ikkala ustunlar ro'yxatlaridagi ustunlar bir xil nomga ega bo'lmasligi kerak.

Tashqi kalit 1-misol

JADVAL SABABI
(Kod_stud tamsayı NULL PRIMARY emas KALIT,
Kod_spec tamsayı NULL emas,

Adres char (50),
O'nli kasr),
Chet el kaliti (Kod_spec) ADABIYOTLAR Spec (Kod_spec)
);

CREATE TABLE o'rniga ALTER TABLE dan foydalanilganda cheklovni qo'llang Chet el kaliti, tashqi kalit va asosiy kalitda ko'rsatilgan qiymatlar mos yozuvlar yaxlitligi holatida bo'lishi kerak. Aks holda, buyruq rad etiladi.

Cheklovdan foydalanish Chet el kaliti jadval yoki ustun, agar ota-ona kaliti PRIMARY chekloviga ega bo'lsa, siz ota-ona kalitlari ustunlari ro'yxatini chiqarib tashlashingiz mumkin KALIT... Tabiiyki, ko'plab maydonlarga ega kalitlarda tashqi va asosiy kalitlardagi ustunlar tartibi bir xil bo'lishi kerak va har qanday holatda ham ikkala tugma o'rtasidagi muvofiqlik printsipi amal qiladi.

Tashqi kalit 2-misol

Jadvalni yaratish
Kod_stud tamsayı NULL PRIMARY EMAS KALIT,
Fam char (30) NULL UNIQUE emas,
Adres char (50),
O'nli kasr),
Kod_spec integer ADABIYOTLAR Spec
);

Yo'naltiruvchi yaxlitlikni saqlab qolish uchun tashqi kalit va asosiy kalit deb e'lon qilingan maydonlarda ifodalanadigan qiymatlarni cheklash talab etiladi. Asosiy kalit har bir tashqi kalit qiymati bir qatorga mos kelishini ta'minlash uchun tuzilgan bo'lishi kerak. Bu shuni anglatadiki, u (kalit) noyob bo'lishi kerak va NULL qiymatlarini o'z ichiga olmaydi.

Agar tashqi kalit kabi talab bajarilsa, bu ota-ona kaliti uchun etarli emas. SQL ota-ona kalitiga ikkita qiymat yoki nol qiymat kiritilmaganligiga ishonch hosil qilish kerak. Shuning uchun, ota-ona kalitlari sifatida ishlatiladigan barcha maydonlarda PRIMARY cheklov mavjudligiga ishonch hosil qilishingiz kerak KALIT yoki NOT NULL cheklovi kabi UNIQUE cheklov.

Chet el kalitlariga faqat asosiy kalitlarga murojaat qilish yaxshi strategiyadir. Chet tugmachalardan foydalanilganda, ular murojaat qilgan ota-ona kalitlari bilan ko'proq bog'liqdir; ular ushbu asosiy kalit topiladigan ma'lum bir jadval qatori bilan bog'langan. O'z-o'zidan, ota tugmachasi tashqi kalitda mavjud bo'lmagan ma'lumotlarni taqdim etmaydi.

Birlamchi kalitning maqsadi qatorning o'ziga xosligini aniqlash bo'lganligi sababli, bu tashqi kalit uchun mantiqiy va unchalik noaniq tanlovdir. Asosiy kalit sifatida noyob kalitdan foydalanadigan har qanday tashqi kalit uchun siz xuddi shu harakat uchun bir xil jadvalning asosiy kalitidan foydalanadigan chet el kalitini yaratishingiz kerak. Satrlarni birlashtirishdan boshqa hech qanday maqsadga ega bo'lmagan tashqi kalit faqat satrlarni aniqlash uchun ishlatiladigan asosiy kalitga o'xshaydi va ma'lumotlar bazasi tuzilishini aniq va sodda saqlash uchun yaxshi usuldir. Chet el kalitida faqat asosiy kalitda ko'rsatilgan yoki bo'sh (NULL) qiymatlar bo'lishi mumkin. Ushbu kalitga boshqa qiymatlarni kiritish urinishlari rad etiladi.

Tashqi kalit 3-misol

JADVAL to'lovini yarating (
sh_payout tamsayı,
sh_eml tamsayı,
sana_ to'lov kuni,
summ_payout real,
Chet el kaliti (sh_eml) ADABIYOTLAR k_sotr2 (eid)
);

Ushbu misolda Chet el kaliti sh_eml ustuni k_sotr2 jadvalidan eid ustuniga bog'langan.

Bu axborotni elektron saqlash, unga kirish bir yoki bir nechta kompyuter yordamida amalga oshiriladi. Odatda ma'lumotlar bazalari ma'lum predmet sohasi, ya'ni inson faoliyatining ma'lum bir sohasi yoki real dunyoning bir qismi to'g'risida ma'lumotlarni o'z ichiga olgan ma'lumotlarni saqlash va ularga kirish uchun yaratiladi.

DBMS ma'lumotlar bazasini yaratish, to'ldirish, yangilash va o'chirish uchun dasturiy ta'minotdir.

Ma'lumotlar bazasida saqlanadigan ma'lumotlarning birligi jadvaldir. Har bir jadval qatorlar va ustunlar to'plamidir, bu erda satrlar ob'ektning, ma'lum bir hodisa yoki hodisaning nusxasiga, ustunlar esa ob'ekt, hodisa yoki hodisaning atributlariga (xususiyatlari, xususiyatlari, parametrlari) mos keladi. Har bir satrda ma'lum bir voqea haqida ma'lumot mavjud.

Ma'lumotlar bazasi nuqtai nazaridan jadval ustunlari maydonlar, qatorlari yozuvlar deb nomlanadi.

Ma'lumotlar bazasi jadvallari o'rtasida munosabatlar bo'lishi mumkin, ya'ni oldingi jadvaldagi ma'lumotlar boshqasiga qo'shilishi mumkin. Alohida jadvallar o'rtasida bog'lanishlar bo'lgan JBlar relyatsion deb nomlanadi. Bitta jadval bitta ma'lumotlar bazasi jadvaliga va bolaga boshqasiga nisbatan asosiy bo'lishi mumkin.

O'zaro munosabatlar bilan bog'langan jadvallar xo'jayin-qul asosida o'zaro ta'sir qiladi. Bitta jadval bitta ma'lumotlar bazasi jadvaliga, ikkinchisiga esa bola bo'lishi mumkin.

Ob'ekt Mavjud va xususiyatlar to'plami bilan ajralib turadigan narsa. Bitta ob'ekt bilan boshqasining orasidagi farq o'ziga xos xususiyat qiymatlari bilan belgilanadi.

Mohiyati - ob'ekt yoki shaxsning xotirasida aks ettirish.

Xususiyat - sub'ektning har qanday xususiyatlarining o'ziga xos qiymati.

Maydon Muayyan atribut qiymatini saqlaydigan bitta yozuv elementi.

Aloqa sohasi bu ikkita jadval bog'langan maydon.

Birlamchi va ikkilamchi tugmalar

Har bir ma'lumotlar bazasi jadvali birlamchi kalitga ega bo'lishi mumkin - bu maydonni yoki yozuvni noyob ravishda aniqlaydigan maydonlarning taboridir.

Ma'lumotlar bazasi jadvalidagi asosiy kalit qiymati yagona bo'lishi kerak, ya'ni jadvalda bir xil asosiy kalit qiymatiga ega bo'lgan ikki yoki undan ortiq yozuvlar bo'lmasligi kerak.

Birlamchi tugmalar jadvallar orasidagi munosabatlarni o'rnatishni osonlashtiradi. Birlamchi kalit yagona bo'lishi kerakligi sababli, u uchun barcha jadval maydonlaridan foydalanish mumkin emas.

Agar jadvalda qiymatlari noyob bo'lgan maydonlar bo'lmasa, birlamchi kalitni yaratish uchun odatda unga qo'shimcha raqamli maydon kiritiladi, uning qiymatlari DBMS o'z xohishiga ko'ra tasarruf etishi mumkin.

Ikkilamchi tugmachalar maydonlar tomonidan o'rnatiladi, ular ko'pincha ma'lumotlarni qidirishda yoki saralashda ishlatiladi: ikkilamchi kalitlarga o'rnatilgan indekslar tizimga tegishli maydonlarda saqlangan kerakli qiymatlarni tezroq topishga yordam beradi.

Asosiy kalitlardan farqli o'laroq, ikkilamchi kalit maydonlarida noyob ma'lumotlar bo'lmasligi mumkin.

Jadvallar orasidagi o'zaro munosabatlar

Bittadan bittaga. Yakkama-yakka munosabatlar ota-onalar jadvalidagi bitta yozuv bolalar jadvalidagi bitta yozuvga to'g'ri kelganda paydo bo'ladi.

Ushbu munosabatlar birdan ko'plarga nisbatan ancha kam uchraydi, agar ma'lumotlar bazasi jadvali ikkilamchi jadvaldan shishishini istamasangiz ishlatiladi. Yakkama-yakka muloqot shu bilan bog'liqki, bir nechta jadvallarda tegishli ma'lumotlarni o'qish uchun bir nechta o'qish operatsiyalari bajarilishi kerak, bu esa kerakli ma'lumotlarni olishni sekinlashtiradi. Bundan tashqari, bittadan munosabatlarga ega jadvallarni o'z ichiga olgan ma'lumotlar bazalarini to'liq normallashgan deb hisoblash mumkin emas.

Birdan ko'pga bo'lgan munosabatlar singari, bir kishi bilan munosabatlar qattiq yoki qattiq bo'lishi mumkin.

Bunga tegishli: SQL Server (2016 yildan boshlab) Azure SQL ma'lumotlar bazasi Azure SQL ma'lumotlar ombori Parallel ma'lumotlar ombori

Birlamchi va chet el tugmachalari SQL Server jadvallaridagi ma'lumotlarning yaxlitligini ta'minlash uchun ishlatilishi mumkin bo'lgan ikki turdagi cheklovlardir. Bu ma'lumotlar bazasining muhim ob'ektlari.

Ushbu mavzu keyingi bo'limlarda tasvirlangan.

Asosiy kalit cheklovlari

Chet elning asosiy cheklovlari

Tegishli vazifalar

Odatda jadvalda jadvalning har bir satrini noyob tarzda aniqlaydigan qiymatlarni o'z ichiga olgan ustun yoki ustunlar birikmasi mavjud. Ushbu ustun yoki ustunlar jadvalning birlamchi kaliti (PK) deb nomlanadi va jadval sub'ektining yaxlitligini ta'minlaydi. Birlamchi kalit cheklovlar ko'pincha identifikator ustunida aniqlanadi, chunki ular ma'lumotlarning noyobligini ta'minlaydi.

Jadvalda birlamchi kalit cheklovini o'rnatganingizda ma'lumotlar bazasi mexanizmi avtomatik ravishda birlamchi kalit ustunlarida noyob indeksni yaratish orqali ma'lumotlarning o'ziga xosligini ta'minlaydi. Ushbu indeks shuningdek, so'rovlarda birlamchi kalitdan foydalanilganda ma'lumotlarga tezkor kirishni ta'minlaydi. Agar birlamchi kalit cheklovi bir nechta ustunda ko'rsatilgan bo'lsa, unda qiymatlar bir xil ustunda takrorlanishi mumkin, ammo asosiy kalitlarni cheklash ta'rifidagi barcha ustunlardan olingan qiymatlarning har bir kombinatsiyasi o'ziga xos bo'lishi kerak.

Quyidagi rasmda ko'rsatilgandek, ustunlar ProductID va VendorID jadvalda Sotib olish. Mahsulot sotuvchisi berilgan jadval uchun kompozit birlamchi kalit cheklovini hosil qiling. Shuningdek, jadvaldagi har bir satr kafolatlangan Mahsulot sotuvchisi qadriyatlarning noyob kombinatsiyasiga ega ProductID va VendorID... Bu takroriy qatorlarni kiritilishining oldini oladi.

    Jadvalda faqat bitta asosiy kalit cheklov mavjud bo'lishi mumkin.

    Birlamchi kalit 16 ustundan oshmasligi va umumiy uzunligi 900 baytdan oshmasligi kerak.

    Birlamchi kalit cheklovi bilan hosil qilingan indeks jadvaldagi indekslar sonining 999 ta klasterlanmagan va 1 ta klasterli indekslardan oshib ketishiga olib kelishi mumkin emas.

    Agar birlamchi kalit cheklovi indeksning klasterli yoki klasterli emasligini ko'rsatmasa, jadvalda hech kim bo'lmasa klasterli indeks yaratiladi.

    Birlamchi kalit cheklovi bo'lgan barcha ustunlar null bo'lmagan deb belgilanishi kerak. Agar null ko'rsatilmagan bo'lsa, unda asosiy kalit cheklovi bo'lgan barcha ustunlar null bo'lmagan deb belgilanadi.

    Agar CLR UDD ustunida birlamchi kalit aniqlangan bo'lsa, ushbu turdagi dastur ikkilik taqqoslashni qo'llab-quvvatlashi kerak.

Chet el kaliti (FK) - bu chet el kalitlari jadvalida saqlanishi mumkin bo'lgan ma'lumotlarni boshqarish uchun ikkita jadvaldagi ma'lumotlar o'rtasidagi munosabatni ta'minlash uchun ishlatiladigan ustun yoki ustunlar birikmasi. Agar bitta jadval uchun birlamchi kalitni o'z ichiga olgan bir yoki bir nechta ustunlarga boshqa jadvalning bir yoki bir nechta ustunlarida havola qilinsa, u holda chet el kalitlari ma'lumotnomasida ikkala jadval o'rtasidagi munosabatlar yaratiladi. Ushbu ustun ikkinchi jadvalda tashqi kalitga aylanadi.

Masalan jadval Savdo. Sotish bo'yicha buyurtma jadval bilan bog'langan Sotish Sotish Shaxsiy chet el kalitidan foydalanish, chunki savdo buyurtmalari va sotuvchilar o'rtasida mantiqiy bog'liqlik mavjud. Ustun SalesPersonID jadvalda Savdo. Sotish bo'yicha buyurtma jadvaldagi asosiy kalit ustuniga mos keladi SalesPerson... Ustun SalesPersonID jadvalda Savdo. Sotish bo'yicha buyurtma stolning chet el kalitidir SalesPerson... Ushbu aloqani tashqi kalit yordamida o'rnatib, qiymati SalesPersonID jadvalga kiritib bo'lmaydi SalesOrderHeaderagar u hozirda jadvalda mavjud bo'lmasa SalesPerson.

Jadval chet el kalitlari (chiquvchi havolalar) sifatida ko'rsatilishi mumkin bo'lgan jadvallar va ustunlarning maksimal soni 253 ni tashkil qiladi. SQL Server 2016 bir xil jadvaldagi ustunlar (kiruvchi havolalar) orqali havola qilinishi mumkin bo'lgan boshqa jadvallar va ustunlar sonining chegarasini 253 ga oshiradi. 10.000 gacha. (Hech bo'lmaganda moslik darajasini 130 talab qiladi.) O'sish quyidagi cheklovlarga ega:

    253 ta chet el kalitlari havolasi faqat DML DELETE operatsiyalari uchun qo'llab-quvvatlanadi. UPDATE va MERGE operatsiyalari qo'llab-quvvatlanmaydi.

    Hozirda ustunlar indekslari, xotirada optimallashtirilgan jadvallar, Stretch ma'lumotlar bazasi yoki qismlarga ajratilgan chet el kalit jadvallari uchun 253 dan ortiq chet el kalitlari mavjud emas.

Xorijiy kalit cheklovlari ko'rsatkichlari

Birlamchi kalit cheklovlaridan farqli o'laroq, tashqi kalit cheklovini yaratish avtomatik ravishda tegishli indeksni yaratmaydi. Biroq, ko'pincha quyidagi sabablarga ko'ra tashqi kalit uchun indeksni qo'lda yaratish kerak bo'ladi:

    Chet el kalitlari ustunlari ko'pincha tegishli jadvallardan ma'lumotlarni so'rash uchun foydalanilganda qo'shilish mezonlarida qo'llaniladi. Bunga bitta jadvaldagi tashqi kalit cheklovidagi ustun yoki ustunlarni boshqa jadvaldagi bir yoki bir nechta asosiy yoki noyob kalit ustunlarga solishtirish orqali erishiladi. Indeks Ma'lumotlar bazasi dvigateliga tegishli ma'lumotlarni chet el kalitlari jadvalidan tezda topishga imkon beradi. Biroq, indeks yaratish ixtiyoriydir. Ikkala bog'liq jadvallarning ma'lumotlari jadvallar o'rtasida birlamchi kalit yoki chet el kalitlari cheklovi aniqlanmagan bo'lsa ham birlashtirilishi mumkin, ammo ikkita jadval o'rtasidagi tashqi kalit aloqasi shuni ko'rsatadiki, ikkita jadval kalitlar mezon sifatida ishlatiladigan so'rovda birgalikda ishlatilishi uchun optimallashtirilgan.

    Chet el kalitlari cheklovlari tegishli jadvallarning asosiy cheklovlariga kiritilgan o'zgarishlarni tasdiqlash uchun ishlatiladi.

Yo'naltiruvchi yaxlitlik

Chet el kalitini cheklashning asosiy maqsadi chet el kalitlari jadvalida saqlanishi mumkin bo'lgan ma'lumotlarni boshqarishdir, ammo bu cheklash, shuningdek, asosiy kalit jadvalidagi ma'lumotlar qanday o'zgarishini boshqaradi. Masalan, sotuvchiga satrni stoldan o'chirishda Sotish Sotish Shaxsiyidentifikatori jadvaldagi savdo buyurtmalarida ishlatiladi Savdo. Sotish bo'yicha buyurtma, ikkita jadvalning mos yozuvlar yaxlitligi buziladi. Masofadagi menejerning savdo buyurtmalari SalesOrderHeader jadvaldagi ma'lumotlarga ulanmasdan yaroqsiz bo'ladi SalesPerson.

Chet tugmachani cheklash bu vaziyatni oldini oladi. Cheklov havolaning yaxlitligini quyidagi tarzda amalga oshiradi: agar u birlamchi kalit jadvalidagi ma'lumotni yaroqsiz holga keltirsa, asosiy kalit jadvalidagi ma'lumotlarga o'zgartirish kiritishga yo'l qo'ymaydi. Agar birlamchi kalit jadvalidagi qatorni o'chirishga yoki ushbu tugmachaning qiymatini o'zgartirishga urinayotganda, boshqa jadvaldagi chet el kalitini cheklashdagi aniq qiymat birlamchi kalitning o'chirilgan yoki o'zgartirilgan qiymatiga mos kelishi aniqlansa, u holda amal bajarilmaydi. Chet tugmachani cheklash bilan qatorni muvaffaqiyatli yangilash yoki o'chirish uchun avval chet el kalitlari jadvalidagi tashqi kalit ma'lumotlarini o'chirib tashlashingiz yoki chet el kalitlari jadvalini boshqa asosiy kalit ma'lumotlari bilan bog'laydigan chet el kalitlari jadvalidagi ma'lumotlarni o'zgartirishingiz kerak.

Yo'naltiruvchi yaxlitlikni kaskadga qo'yish

Butunlay kaskadli mos yozuvlar bilan cheklashlardan foydalanib, ma'lumotlar bazasi dvigatelining foydalanuvchi chet el kalitlari mavjud bo'lgan kalitni o'chirishga yoki yangilashga urinish paytida amalga oshiradigan harakatlarini belgilashingiz mumkin. Quyidagi kaskadli harakatlarni aniqlash mumkin.

HARAKAT YO'Q
Ma'lumotlar bazasi mexanizmi xatoga yo'l qo'yadi va keyin o'chirish yoki yangilash operatsiyasini ota-jadvaldagi qatorga qaytaradi.

KASKAD
Agar berilgan qator yangilangan yoki ota-jadvaldan o'chirilgan bo'lsa, mos keladigan satrlar mos yozuvlar jadvalidan yangilanadi yoki o'chiriladi. Agar ustun turi bo'lsa, CASCADE qiymatini ko'rsatish mumkin emas vaqt tamg'asi chet el yoki havola qilingan kalitning bir qismidir. ON DELETE CASCADE harakatini INSTEAD OF DELETE tetikleyicisi aniqlangan jadvalda ko'rsatib bo'lmaydi. INSTEAD OF UPDATE triggerlari aniqlangan jadvallar uchun UPDATE CASCADE-ni aniqlab bo'lmaydi.

NULL-ni o'rnating
Chet el kalitini tashkil etuvchi barcha qiymatlar ota-jadvaldagi tegishli satr yangilanganda yoki o'chirilganda NULL-ga o'rnatiladi. Ushbu cheklovni qondirish uchun tashqi kalit ustunlari bo'sh bo'lishi kerak. O'RNATISh UPDATE triggerlari aniqlangan jadvallarga o'rnatib bo'lmaydi.

VAQTNI O'RNATISH
Tashqi kalitni tashkil etuvchi barcha qiymatlar ota-jadvalning tegishli satri o'chirilganda yoki yangilanganda ularning asl qiymati bo'yicha o'rnatiladi. Ushbu cheklovga erishish uchun barcha tashqi kalit ustunlar standart ta'riflarga ega bo'lishi kerak. Agar ustun nolga teng bo'lsa va sukut bo'yicha aniq belgilanmagan bo'lsa, ustun uchun sukut NULL bo'ladi. O'RNATISh UPDATE triggerlari aniqlangan jadvallarga o'rnatib bo'lmaydi.

O'zaro bog'langan jadvallarda CASCADE, SET NULL, SET DEFAULT va NO ACTION kalit so'zlarini birlashtirish mumkin. Ma'lumotlar bazasi mexanizmi NO ACTION kalit so'ziga duch kelsa, u to'xtaydi va tegishli CASCADE, SET NULL va SET DEFAULT amallarini qaytaradi. Agar DELETE buyrug'ida CASCADE, SET NULL, SET DEFAULT va NO ACTION kalit so'zlari birikmasi bo'lsa, u holda barcha CASCADE, SET NULL va SET DEFAULT operatsiyalari Ma'lumotlar bazasi dvigateli YO'Q HARAKAT izlamasdan oldin bajariladi.

Triggerlar va kaskadli ma'lumotnomalar

YANGILAShDAN KEYIN yoki O'chirishdan keyin kaskadli mos yozuvlar amallari quyidagicha boshlanadi:

    Dastlabki DELETE yoki UPDATE iborasi tomonidan to'g'ridan-to'g'ri chaqirilgan barcha kaskadli yo'naltiruvchi harakatlar avval bajariladi.

    O'zgartirilgan jadvallarda AFTER triggerlari aniqlangan bo'lsa, bu tetiklar barcha kaskadli harakatlar bajarilgandan so'ng o'chiriladi. Ushbu triggerlar kaskadli harakatlarning teskari tartibida otiladi. Agar bitta jadval uchun bir nechta triggerlar aniqlangan bo'lsa, ular jadvalning birinchi va oxirgi triggerlari ta'kidlanmagan bo'lsa, ular tasodifiy tartibda otiladi. Ushbu buyurtma protsedura bilan belgilanadi.

    Agar kaskadli ketma-ketliklar DELETE yoki UPDATE harakatlarining to'g'ridan-to'g'ri maqsadi bo'lgan jadvaldan kelib chiqsa, triggerlarni otish tartibi ketma-ketliklar bilan belgilanmagan. Biroq, harakatlar ketma-ketligi har doim ikkinchisidan oldin barcha ogohlantirishlarni yoqadi.

    DELETE yoki UPDATE harakatlarining to'g'ridan-to'g'ri maqsadi bo'lgan jadvalning AFTER tirgovichi har qanday qator o'zgarganligidan qat'iy nazar o'chiriladi. Bunday holda, kaskad boshqa jadvallarga ta'sir qilmaydi.

    Agar oldingi triggerlardan biri boshqa jadvallarda DELETE yoki UPDATE operatsiyalarini bajaradigan bo'lsa, bu operatsiyalar o'zlarining kaskadli ketma-ketliklarini chaqirishi mumkin. Ushbu ikkinchi darajali ish oqimlari har bir DELETE yoki UPDATE operatsiyalari uchun birlamchi ish oqimlarining barcha triggerlari bajarilgandan so'ng qayta ishlanadi. Ushbu jarayon keyingi DELETE yoki UPDATE operatsiyalari uchun rekursiv ravishda takrorlanishi mumkin.

    Triggerlar ichida CREATE, ALTER, DELETE yoki boshqa DDL operatsiyalarini bajarish DDL triggerlarining yonishini keltirib chiqarishi mumkin. Bu qo'shimcha kaskadli ketma-ketlikni boshlaydigan va ularning triggerlarini yoqadigan keyingi O'chirish yoki UPDATE operatsiyalariga olib kelishi mumkin.

    Agar biron bir aniq havolali amallar ketma-ketligida xatolik yuz bersa, ushbu ketma-ketlikda AFTER triggerlari o'chirilmaydi va ushbu ketma-ketlik natijasida hosil bo'lgan O'chirish yoki UPDATE operatsiyalari orqaga qaytariladi.

    INSTEAD OF trigger aniqlangan jadvalda ma'lum bir kaskadli harakatni ko'rsatuvchi ADABIYOTLAR bandi bo'lishi mumkin. Shu bilan birga, kaskadli maqsad jadvalidagi AFTER tetiği boshqa jadvalda INSERT, UPDATE yoki DELETE buyrug'ini bajarishi yoki ushbu ob'ekt uchun INSTEAD OF triggerini ishga tushirishi mumkin.

Quyidagi jadvalda asosiy kalit va tashqi kalit cheklovlari bilan bog'liq umumiy vazifalar keltirilgan.

Oxirgi yangilanish: 27.04.2019

Chet el kalitlari jadvallar orasidagi aloqalarni o'rnatishga imkon beradi. Chet el kaliti qaram, bo'ysunuvchi jadvaldagi ustunlar uchun o'rnatiladi va asosiy jadvaldagi ustunlardan biriga ishora qiladi. Odatda, chet el kaliti tegishli master jadvalidagi asosiy kalitga ishora qiladi.

Chet el kalitini jadval darajasida o'rnatish uchun umumiy sintaksis:

Chet el kaliti (ustun1, ustun2, ... ustunN) MA'LUMOTLAR master_table (column_main_table1, column_main_table2, ... column_main_tableN)

Chet tugmachani cheklashini yaratish uchun FOREIGN KEY tugmachasidan keyin siz tashqi kalitni ko'rsatadigan jadval ustunini belgilaysiz. REFERENCES kalit so'zidan keyin tegishli jadval nomi, so'ngra tashqi kalit ko'rsatadigan qavs ichidagi tegishli ustun nomi keltiriladi. REFERENCES iborasidan keyin navbatdagi qator o'chirilganda va asosiy jadvaldan yangilanishda bajariladigan amalni belgilaydigan ON DELETE va ON UPDATE so'zlari keladi.

Masalan, ikkita jadvalni aniqlaymiz va ularni tashqi kalit yordamida bog'laymiz:

JADVAL Mijozlarini yarating (Id INT PRIMARY KEY AUTO_INCREMENT, Age INT, ism VARCHAR (20) NULL EMAS, familiya VARCHAR (20) NULL emas, Telefon VARCHAR (20) NULL NEGIL EMAS); Jadval buyurtmalarini yaratish (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERANSES Clients (Id));

Bunday holda, mijozlar va buyurtmalar jadvallari aniqlanadi. Mijozlar mas'uldir va mijozni anglatadi. Buyurtmalar bog'liq va mijoz tomonidan berilgan buyurtmani aks ettiradi. Buyurtmalar jadvali mijozlar jadvali va uning Id ustuniga CustomerId ustuni orqali bog'langan. Ya'ni, CustomerId ustuni - bu xaridorlar jadvalidan Id ustuniga ishora qiluvchi tashqi kalit.

CONSTRAINT iborasi bilan siz tashqi kalitlarni cheklash uchun nomni belgilashingiz mumkin:

Jadval buyurtmalarini yaratish (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, CONSTRAINT orders_custonmers_fk FOREIGN KEY (CustomerId) REFERANSES Mijozlar (Id));

O'chirish va yangilash to'g'risida

Amalga oshiriladigan amallarni o'rnatish uchun ON DELETE va ON UPDATE so'zlari yordamida tegishli jadval ketma-ket qator o'chirilganda va o'zgartirilganda foydalanish mumkin. Amal sifatida quyidagi variantlardan foydalanish mumkin:

    CASCADE: Asosiy jadvaldagi tegishli qatorlarni o'chirishda yoki o'zgartirganda qaram jadvaldagi qatorlarni avtomatik ravishda o'chiradi yoki o'zgartiradi.

    SET NULL: Asosiy jadvaldan tegishli qatorni o'chirishda yoki yangilashda tashqi kalit ustunini NULL-ga o'rnatadi. (Bunday holda, tashqi kalit ustuni NULL sozlamalarini qo'llab-quvvatlashi kerak)

    Cheklov: Agar bog'liq jadvalda tegishli qatorlar bo'lsa, asosiy jadvaldagi qatorlarni o'chirishni yoki o'zgartirishni rad etadi.

    HARAKAT YO'Q: cheklov bilan bir xil.

    O'RNATIShNI O'RNATISH: Bosh jadvaldan tegishli qatorni o'chirishda, tashqi kalit ustunini DEFAULT atributlari yordamida o'rnatiladigan standart qiymatiga o'rnatadi. Ushbu parametr printsipial jihatdan mavjud bo'lsa-da, InnoDB dvigateli ushbu iborani qo'llab-quvvatlamaydi.

Kaskadli o'chirish

Kaskadli o'chirish, asosiy jadvaldagi qatorni o'chirishda, bog'liq bo'lgan barcha qatorlarni avtomatik ravishda bog'liq jadvaldan o'chirishga imkon beradi. Buning uchun CASCADE opsiyasidan foydalaniladi:

Jadvaldagi buyurtmalarni yarating (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERANSIES Mijozlar (Id) o'chirilgan kassada);

ON UPDATE CASCADE bayonoti xuddi shunday ishlaydi. Birlamchi kalit qiymatini o'zgartirish unga bog'liq bo'lgan tashqi kalitning qiymatini avtomatik ravishda o'zgartiradi. Biroq, asosiy tugmachalar juda kam o'zgartirilganligi sababli, asosan, o'zgaruvchan qiymatlari bo'lgan ustunlarni asosiy kalit sifatida ishlatish tavsiya etilmaydi, amalda ON UPDATE iborasi kamdan kam qo'llaniladi.

NULL-ni sozlash

Chet kalit uchun SET NULL parametrini o'rnatish uchun chet el ustunining nolga teng bo'lishi kerak:

Jadval buyurtmalarini yaratish (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERANSIES Mijozlar (Id) O'CHIRILGAN SET NULL);

Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: