Ma'lumotlar bazasining yaxlitligini nazorat qilish
Ma'lumotlar bazalari haqida bilishingiz kerak bo'lgan yana bir muhim narsa - bu constraits (CONSTRAINS). Constraintlar yordamida siz ma'lumotlaringizni jadvaldagi o'zgarishlarni nazorat qilishingiz va ularning yaxlitligi va mosligini qo'llab-quvvatlashingiz mumkin.
Ma'lumotlar bazasi haqida gapirganda ma'lumotlarning mosligi nima?
Keling, internet-do'konimizdagi employee, product va task jadvalini olaylik. Biz allaqachon bilamizki, task jadvalida hech kimga tayinlanmagan vazifalar bo'lishi mumkin: bunday qatorlarda employee_id NULL ga teng.
Ammo task jadvalida employee_id masalan, 115 ga teng bo'lsa nima bo'ladi? Chunki employee jadvalida bunday xodim mavjud emas. Bizda employee jadvalida id = 115 bo'lgan xodim yo'q. Shu bilan birga, task jadvalida bunday id bo'lgan xodimga havola mavjud. Bu ma'lumotlarning mos emasligi misolidir.
Xo'sh, bu ma'lumotlarni qanday moslashtiramiz? Ideal variant, SQL-server har qanday o'zgarish yuz berganda bu nozik jihatlarni nazorat qilsa. Va bunday imkoniyat mavjud, bu FOREIGN_KEY deb ataladi.
Agar jadvalingizdagi ba'zi ustunlar other jadvaldagi qatorlarning id-larini o'z ichiga olsa, buni aniq ko'rsatish mumkin.
FOREIGN KEY qo'shish
Bunday kalitni jadvalga yaratish bosqichida yoki undan keyin ALTER TABLE yordamida qo'shishingiz mumkin. Format umuman farq qilmaydi. Ikkala variantni ham keltiramiz.
Bunday kalit/qoidaning umumiy ko'rinishi quyidagi kabi:
FOREIGN KEY (ustun) REFERENCES jadval(ustun)
Keling, bu kalit/qoidani task jadvaliga qo'shamiz, shunda barcha employee_id employee jadvalidagi mavjud yozuvga mos kelsin. Bu skript quyidagicha ko'rinadi:
ALTER TABLE task ADD FOREIGN KEY (employee_id) REFERENCES employee(id)
Agar biz bu qoida task jadvalini yaratishda qo'shishga qaror qilsak, kod quyidagicha ko'rinardi:
CREATE TABLE task ( id INT, name VARCHAR(100), employee_id INT, deadline DATE, PRIMARY KEY (id), FOREIGN KEY (employee_id) REFERENCES employee(id) );
Aytgancha, shunday vaziyatlar bo'ladiki, biz havola qilayotgan qator noyob birikma kalitga ega: masalan "FIO va tug'ilgan yili" yoki "productCatogoryId va productId". Keyin FOREIGN KEY ni quyidagicha yozish mumkin:
FOREIGN KEY (bizning_ustun1, bizning_ustun2) REFERENCES jadval(ularning_ustun1, ularning_ustun2)
FOREIGN KEY va ma'lumotlarni o'zgartirish
Endi employee jadvalida ba'zi ma'lumotlarni yangilashga va xodimning id o'zgarishiga qaror qildik deb tasavvur qiling. Bu paytda task jadvalidagi ma'lumotlar bilan nima sodir bo'ladi? To'g'ri, ular ahamiyatsiz bo'lib qoladi va ma'lumotlar bazamizning yaxlitligi buziladi.
Bunday muammolarning oldini olish uchun employee jadvalidagi id o'zgartirilganda, barcha ushbu o'zgartirilgan id-ga havola qilayotgan barcha jadvalning employee_id sifatida o'zgartirilishini SQL-serverga ko'rsatishimiz mumkin.
Bunday stsenariyalar OnUpdate va OnDelete deb ataladi. Id yozuvini o'zgartirganda nima qilish kerak va yozuv o'chirilganda nima qilish kerak?
O'chirish bilan hammasi aniq emas. Agar sizda bir-biriga havola qilingan, BД da qatorlar bilan ifodalangan bog'liq ob'ektlar mavjud bo'lsa, bir ob'ektni o'chirganda turli xil stsenariylar mavjud bo'lishi mumkin.
Masalan, bizda sayt foydalanuvchisi o'chirilsa, biz uning barcha shaxsiy yozishmalarini o'chirishimiz kerak bo'ladi. Ammo ehtimol biz uning barcha ommaviy sharhlarini o'chirmasligimiz mumkin.
Yoki xodim ishdan ketadi. Ajablanarli narsa bo'ladi, agar u ishdan ketganida, unga berilgan vazifalar ma'lumotlar bazasidan yo'qolgan bo'ladi. Ammo agar ular unga berilgan bo'lsa, bu ham yomon bo'ladi. To'g'ri, xodim o'z vazifalarini boshqa odamlarga tayinlab, ishdan ketishi mumkin bo'ladi.
Bu stsenariylarni FOREIGN KEY yordamida quyidagicha tasvirlashimiz mumkin. Bunday kalit/qoidaning umumiy ko'rinishi quyidagicha:
FOREIGN KEY (ustun) REFERENCES jadval(ustun) [ON DELETE reference_option] [ON UPDATE reference_option]
Qanday qilib o'chirish (ON DELETE) yoki o'zgartirish (ON UPDATE) holatlarida yozuvlarni o'zgartirish kerak? Umuman olganda, bu vaziyatlarda SQL-serverning 5 ta variantli harakati mavjud:
| # | reference_option | Izoh |
|---|---|---|
| 1 | RESTRICT | Qatorda havolalar topilganda harakatni taqiqlash |
| 2 | CASCADE | Id ni bog'liq qatorlarda o'zgartirish |
| 3 | SET NULL | Id ni bog'liq qatorlarda NULL ga o'rnatish |
| 4 | NO ACTION | Hech narsa qilmaslik |
| 5 | SET DEFAULT x | Id ni bog'liq qatorlarda x qiymatiga o'rnatish |
Task jadvalimizni qanday o'zgartirish mumkinligi quyidagicha:
ALTER TABLE task ADD FOREIGN KEY (employee_id) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE RESTRICT;
Bu yerda nima yozilgan:
ON UPDATE CASCADE: Employee jadvalidagi id o'zgarganda, task jadvalidagi employee_id ni ham o'zgartirish.
ON DELETE RESTRICT: Agar employee jadvalidagi qator o'chirilsa va task jadvalidan unga havola bo'lsa, employee jadvalidan qatorni o'chirishni taqiqlash.
GO TO FULL VERSION