Butunlik cheklovlarini aniqlash. Chet el kalitlari FOREIGN KEY SQL birlamchi kalit nima uchun

Ushbu maqolada biz kalitlarga tegishli hamma narsani ko'rib chiqishga harakat qilamiz SQL: bu nima uchun, kalitlarni yaratish, cheklash. Umuman olganda: bu zerikarli bo'ladi 😉

Bugungi kun rejasi:

Ma'lumotlar bazasi nazariyasida - kalitlar ma'lumotlar bazalari jadvallaridagi ma'lumotlar yaxlitligini va mavjudligini ta'minlaydigan ba'zi cheklovlarni o'rnatish uchun yaratilgan ba'zi bir ob'ektlar.

Oddiy so'zlar bilan aytganda, tugmachalar kv ustunning qo'shimcha funktsiyalarini ko'rsatish uchun mo'ljallangan. Bu o'ziga xoslikmi yoki ustun boshqa jadvalga ishora qiladimi (tashqi kalit).

Asosiy kalit

Ma'lumotlar bazasida noyob bo'lishi kerak bo'lgan ustun asosiy kalit bilan belgilanadi. Birlamchi kalit yoki asosiy kalit jadvalda birlamchi kalit ustunining qiymatini takrorlash mumkin emasligini anglatadi. Shunday qilib, ushbu kalit jadvaldagi yozuvni ustun qiymatining takrorlanishidan qo'rqmasdan noyob tarzda aniqlashga imkon beradi. Birgina misol: aytaylik, sizda foydalanuvchilar jadvali bor. Ushbu jadval maydonlarni o'z ichiga oladi: to'liq ismi, tug'ilgan yili, telefon. Foydalanuvchini qanday aniqlash mumkin? Ism va telefon raqami kabi parametrlarga ishonishingiz mumkin emas. Axir bizda bir xil familiya bilan emas, balki ism bilan ham bir nechta foydalanuvchilar bo'lishi mumkin. Vaqt o'tishi bilan telefon raqami o'zgarishi mumkin va telefon raqamiga ega foydalanuvchi bizning ma'lumotlar bazamizda bo'lmasligi mumkin.

Shuning uchun ular asosiy kalitni o'ylab topdilar. Bir marta noyob identifikator tayinlangan va shu bilan. IN mySql misolida biz daladagi barcha misollarni keltiramiz AUTO_INCREMENT bu asosiy kalit ekanligini ko'rsatmasangiz o'rnatib bo'lmaydi.

Yozuvni yaratishda asosiy kalit sifatida belgilangan maydon bo'sh bo'lishi mumkin emasligini eslatib o'tishning hojati yo'q deb o'ylayman.

Tashqi kalit ( tashqi kalit)

Yana bor tashqi kalit (tashqi kalit). U shuningdek ma'lumotnoma deb ham ataladi. Jadvallarni bir-biriga bog'lab qo'yish kerak.

Yuqoridagi rasmga qaraganda, poyabzal jadvalidagi xorijiy kalit etkazib beruvchidir. Qoida tariqasida, jadval yaratishda yagona butun qiymatlar ustuni ko'rsatiladi. Jadvalni yaratishda buni qanday qildik etkazib beruvchi.

Spiker etkazib beruvchi_id har bir yozuv uchun noyob bo'ladi. Uning ma'nosi va ustunning qasosiga ta'sir qiladi provayder jadvalda poyabzal.Men darhol taklif qilaman va tashqi kalit qanday yaratilishini misol bilan ko'rib chiqaman.

Chet el kalitini yaratish

stol poyafzallarini yaratish (shoes_id int auto_increment asosiy kaliti, sarlavha matni, hajmi int, narx o'zgaruvchisi, count int, varchar turi (30), etkazib beruvchi int, tashqi kalit (etkazib beruvchi) ma'lumotlari etkazib beruvchi (etkazib beruvchi_id));

Yuqoridagi misolda ko'rib turganingizdek, chet el kalitini yaratish sintaksisi juda oddiy. Jadvalga maydon qo'shishingiz kerak, so'ngra bu maydonni tashqi kalit deb e'lon qilishingiz va qaerga murojaat qilishingizni ko'rsatishingiz kerak. Bunday holda, maydon etkazib beruvchi maydonga murojaat qiladi etkazib beruvchi_id jadvalda etkazib beruvchi.

Kompozit kalit (kompozit kalit)

Kompozit kalitga kelsak, jadvalda bir nechta asosiy tugmalar mavjud. Shunday qilib, yaratish kompozit kalit, yozuvning o'ziga xosligi ushbu kalitga birlashtirilgan maydonlar tomonidan tekshiriladi.

Jadvalga kiritishda birdaniga bir nechta maydonlardan foydalanib, yozuvning o'ziga xosligini tekshirish kerak bo'lgan holatlar mavjud. Shuning uchun kompozit kalit ixtiro qilingan. Masalan, men bilan oddiy jadval tuzaman kompozit kalit sintaksisini ko'rsatish uchun:

Jadval testini yarating (field_1 int, field_2 matni, field_3 bigint, asosiy kalit (field_1, field_3));

Yuqoridagi misolda ikkita maydon kompozit kalitga birlashtirilgan va jadvalda shu bir xil maydonlarga ega yozuvlar bo'lmaydi.

Buning hammasi kalitlar uchun SQL. Bu kichik o'quv qo'llanma - biz jadvallarni bitta ma'lumotlar bazasini tashkil qilishi uchun qanday qilib birlashtirishni batafsil ko'rib chiqadigan maqolaga tayyorgarlik.

) biz relyatsion (jadvalli) ma'lumotlar bazasi qanday ishlashini tahlil qildik va relyatsion ma'lumotlar bazasining asosiy elementlari: jadvallar, ustunlar va satrlar, matematik jihatdan: munosabatlar, atributlar va korreklar ekanligini aniqladik. Shuningdek, ko'pincha satrlar yozuvlar, ustunlar ustunlar, yozuv va ustunlar kesishmasi katakcha deb nomlanadi.

Shuni esda tutish kerakki, satr tarkibi va ustun nomlari bir xil ma'lumotlar bazasida noyob bo'lishi kerak.

Ma'lumotlar bazalaridagi ma'lumotlar turlari

Matnlar, sanalar, vaqtlar, hodisalar, raqamlar: har qanday turdagi ma'lumotlar bazalarini yaratishingiz mumkinligini tushunish muhimdir. Relyatsion ma'lumotlar bazalari ma'lumot turiga qarab turlarga bo'linadi. Har bir ma'lumot turi (atribut) o'ziga xos belgiga ega:

  • INTEGER - butun sonlardan olingan ma'lumotlar;
  • FLOAT - suzuvchi nuqta deb ataladigan kasr sonlardan olingan ma'lumotlar;
  • CHAR, VARCHAR - matnli ma'lumotlar turlari (belgi);
  • Mantiqiy - mantiqiy ma'lumotlar turi (ha / yo'q);
  • DATE / TIME - vaqtinchalik ma'lumotlar.

Bu ma'lumotlar turlarining asosiy turlari, ulardan yana ko'plari mavjud. Bundan tashqari, har bir dasturlash tilida o'ziga xos tizim atributlari to'plami mavjud (ma'lumotlar turlari).

Ma'lumotlar bazasi jadvallarining birlamchi va tashqi kalitlari nima

Asosiy kalit

Biz yuqorida esladik: ma'lumotlar bazasining har bir satri (yozuvi) o'ziga xos bo'lishi kerak. Bu har bir yozuvni maksimal darajada aniqlaydigan aniq qiymatlar to'plami ko'rinishidagi asosiy kalit. Siz buni boshqacha qilib belgilashingiz mumkin. Boshlang'ich kalit: har bir yozuvga xos bo'lgan o'ziga xos xususiyatlar to'plami. Asosiy kalit asosiy kalit sifatida belgilanadi.

Asosiy kalit (PK) har bir stol uchun juda muhimdir. Buning sababini tushuntirib beray.

  • Birlamchi kalit jadvalda bir xil yozuvlarni (qatorlarni) yaratishga imkon bermaydi;
  • PK bir xil ma'lumotlar bazasidagi jadvallar o'rtasida mantiqiy aloqani ta'minlaydi (relyatsion ma'lumotlar bazalari uchun).

Jadvallar orasidagi mantiqiy aloqada to'xtash kerak.

Tashqi kalit

Chet el kaliti, qisqa vaqt ichida FK. Xuddi shu ma'lumotlar bazasidagi jadvallar o'rtasida aniq mantiqiy aloqani ta'minlaydi.

Masalan, ikkita A va B jadvallar mavjud (A poyabzal) jadvalda asosiy kalit mavjud: hajmi, B jadvalida (rang) nom o'lchamiga ega ustun bo'lishi kerak. Ushbu jadvalda "o'lcham" B va A jadvallari orasidagi mantiqiy bog'lanish uchun tashqi kalit bo'ladi.

Keyinchalik murakkab misol.

Ikkita ma'lumotlar jadvali: Odamlar va telefon raqamlari.

Jadval: Odamlar

Jadval: Telefon raqamlari

PK telefon raqamlari jadvalida noyobdir. Ushbu jadvalning FK - bu odamlar jadvalining PK. Telefon raqamlari va odamlar o'rtasidagi aloqani FK telefon jadvallari taqdim etadi. Ya'ni:

  • Zaytsevning ikkita telefoni bor;
  • Volkovda ikkita telefon mavjud;
  • Belkinda bitta telefon bor.
asosiy kalit va tashqi kalit

Xulosa qilib aytganda, har qanday narsani qo'shib qo'yaman ma'lumotlar bazasi menejeri, asosiy kalitni tuzish uchun texnik imkoniyatlarga ega.

Boshlang'ich kalit - asosiy kalit, jadvaldagi har bir yozuvni noyob tarzda aniqlashga imkon beruvchi cheklov SQL.

Boshlang'ich kalit Oracle
Asosiy kalit ( Boshlang'ich kalit) jadvallarni yoki ularning ustunlarini cheklashi mumkin. Ushbu cheklov UNIQUE cheklovi bilan bir xil ishlaydi. Biroq, siz asosiy kalitlar va ustunlarning o'ziga xosligi o'rtasidagi farqni ularni tashqi kalitlar bilan ishlatishda hisobga olishingiz kerak. Asosiy tugmalar NULL qiymatlariga ruxsat berolmaydi. Bu shuni anglatadiki, UNIQUE cheklovidagi maydonlar kabi, cheklovda ishlatiladigan har qanday maydon Boshlang'ich kalit, NOT NULL allaqachon e'lon qilinishi kerak.

Boshlang'ich kalit Oracle... Misol №1.
Jadval yaratish misoli SQL cheklash bilan Boshlang'ich kalit:

Talaba
(Kod_stud tamsayı NULL emas Boshlang'ich kalit,
Fam char (30) NULL UNIQUE emas,
Adres char (50),
O'nli kasr);

Eng yaxshisi cheklov qo'yishdir Boshlang'ich kalit noyob satr identifikatorini hosil qiladigan maydonda (yoki maydonlarda) va satrlarni aniqlash uchun emas, balki mantiqan noyob bo'lishi kerak bo'lgan maydonlar uchun (masalan, telefon raqamlari yoki ism maydonlari) UNIQUE cheklovini saqlang. Cheklov Boshlang'ich kalit qiymatlarning noyob kombinatsiyasini tashkil etadigan bir nechta maydonlarga ham qo'llanilishi mumkin:

Boshlang'ich kalit Oracle... Misol # 2.

JADVAL yarating Talaba
(Fam char (30) NULL emas,
Im char (30) NULL EMAS
Adres char (50),
Boshlang'ich kalit (Fam, Im));

Boshlang'ich kalit MySQL

ASOSIY KEY SQL / MySQL... Misol № 3.

JADVAL yarating Shaxslar (
P_Id int NOT NULL,
Familiya varchar (255) NULL EMAS,
Birinchi ism varchar (255),
Varchar (255) manzili,
Shahar varchar (255),
Boshlang'ich kalit (P_Id));

ASOSIY KEY SQL / MySQL... Misol № 4.

JADVAL yarating `ad_packages` (
`id` int (111) NULL emas auto_increment,
`title` varchar (132) NULL EMAS",
"price` float NOT NULL default" 0 ",
`type` varchar (22) NULL standart emas",
`c_type` enum (" cash ", 'bal', 'rur') NULL EMAS default" cash ",
Boshlang'ich kalit ("id")
);

ASOSIY KEY SQL / MySQL... 5-misol.

TABLE `gamestat` (
`id` int (11) NULL emas auto_increment,
`game` varchar (10) NULL EMAS standart" tuz ",
"stavok` int (11)" 0 "null qiymatini emas,
"usd` float NOT NULL default '0',
"rur` float NOT" NULL default "0",
"point` float NOT NULL default" 0 ",
`bank_usd` kasr (12,2) NULL emas‘ 0.00 ’,
`bank_rur` kasr (12,2) NULL emas‘ 0.00 ’,
"bank_point`" kasr (12,2) NULL emas "0.00",
BIRINChI KEY (`id`)
);

Ma'lumot turlarining o'zi jadvalda saqlanishi mumkin bo'lgan ma'lumotlarni cheklaydi. Biroq, ko'plab dasturlar uchun bu cheklovlar juda qattiq. Masalan, mahsulot narxini o'z ichiga olgan ustun, ehtimol, faqat ijobiy qiymatlarni qabul qilishi kerak. Ammo bunday standart ma'lumotlar turi mavjud emas. Siz ustunlar ma'lumotlarini boshqa ustunlar yoki qatorlarga nisbatan cheklashni xohlashingiz mumkin. Masalan, mahsulot haqida ma'lumot berilgan jadvalda ma'lum bir mahsulot kodiga ega bo'lgan bitta qator bo'lishi kerak.

Buning uchun SQL ustunlar va jadvallardagi cheklovlarni aniqlashga imkon beradi. Cheklovlar sizga jadvallardagi ma'lumotlarni kerakli tarzda boshqarish qobiliyatini beradi. Agar foydalanuvchi ustunda cheklovlarni buzadigan qiymatni saqlashga harakat qilsa, xato bo'ladi. Bu standart bo'lsa ham, cheklovlar qo'llaniladi.

5.3.1. Cheklovlarni tekshiring

Cheklovni cheklash - bu eng keng tarqalgan cheklash turi. Uning ta'rifida siz berilgan ustunning qiymati mantiqiy ifodani (haqiqat testi) qondirishi kerakligini belgilashingiz mumkin. Masalan, mahsulot narxi quyidagi ijobiy qiymatlar bilan cheklanishi mumkin:

Matnning nomi, narxi raqamli Tekshirish (narx\u003e 0) );

Ko'rib turganingizdek, cheklov ma'lumotlar turidan keyin aniqlanadi, xuddi sukut bo'yicha. Standart va cheklovlar har qanday tartibda belgilanishi mumkin. Tekshirish cheklovi CHECK kalit so'zidan keyin qavs ichiga olingan iboradan iborat. Ushbu ibora cheklangan ustunni o'z ichiga olishi kerak, aks holda bu juda mantiqiy emas.

Shuningdek, siz cheklovga alohida nom berishingiz mumkin. Bu xato xabarlarini yaxshilaydi va ushbu cheklovni o'zgartirish kerak bo'lganda murojaat qilishingizga imkon beradi. Siz buni shunday qilishingiz mumkin:

CONSTRAINT ijobiy_ narx Tekshirish (narx\u003e 0));

Ya'ni, nomlangan cheklovni yaratish uchun CONSTRAINT kalit so'zini keyin identifikator va cheklash ta'rifining o'zi yozing. (Agar siz cheklov nomini shu tarzda aniqlamasangiz, tizim siz uchun uning nomini tanlaydi.)

Tasdiqlash cheklovi bir nechta ustunlarga ham murojaat qilishi mumkin. Masalan, odatdagi narx va chegirmali narxni saqlasangiz, chegirmali narx odatdagi narxdan har doim past bo'lishiga ishonch hosil qilishingiz mumkin:

TABLE mahsulotlarini yarating (product_no integer, ism matni, narx raqamli CHECK (narx\u003e 0), diskontlangan_ narx raqamli CHECK (diskontlangan_ narx\u003e 0), CHECK (narx\u003e chegirmali_ narx) );

Birinchi ikkita cheklov shunga o'xshash tarzda aniqlanadi, ammo uchinchisi yangi sintaksisdan foydalanadi. U ma'lum bir ustun bilan bog'lanmagan, ammo ro'yxatdagi alohida element sifatida ko'rsatilgan. Ustun ta'riflari va bunday cheklov ta'riflari har qanday tartibda qayta tuzilishi mumkin.

Dastlabki ikkita cheklovni ustun cheklovlari deb aytish mumkin, uchinchisi jadval cheklovidir, chunki u ustun ta'riflaridan alohida yozilgan. Ustun cheklovlari jadval cheklovlari sifatida ham yozilishi mumkin, aksincha har doim ham imkoni bo'lmaydi, chunki ustun cheklovi faqat tegishli ustunga tegishli. (Postgres Pro buni talab qilmasa ham, boshqa DBMS-lar bilan mos kelish uchun ushbu qoidaga amal qilgan ma'qul.) Oldingi misolni quyidagicha qayta yozish mumkin:

TABLE mahsulotlarini yarating (product_no integer, nom matni, narx raqamli, CHECK (narx\u003e 0), diskontlangan_ narx narx, CHECK (diskontlangan_ narx\u003e 0), CHECK (narx\u003e diskontlangan_ narx));

Yoki shunga o'xshash:

TABLE mahsulotlarini yarating (product_no integer, name text, price numberic CHECK (price\u003e 0), discounted_price numeric, CHECK (discounted_price\u003e 0 AND price\u003e discounted_price));

Bu lazzat masalasidir.

Siz jadval cheklovlarini ustun cheklovlari singari nomlashingiz mumkin:

TABLE mahsulotlarini yarating (product_no integer, ism matni, narx raqami, CHECK (narx\u003e 0), diskontlangan_ narx narx, CHECK (diskontlangan_ narx\u003e 0), CONSTRAINT amaldagi_chegirma CHECK (narx\u003e chegirmali_ narx));

E'tibor bering, agar ifoda true yoki NULL bo'lsa, sinov cheklovi qondiriladi. NULL operandlari bilan ko'plab ifodalar NULLga olib kelishi sababli, bunday cheklovlar NULL-larning tegishli ustunlarga yozilishiga to'sqinlik qilmaydi. Ustunda NULL qiymatlari mavjud emasligini ta'minlash uchun keyingi bobda bayon qilingan NOT NULL cheklovidan foydalanishingiz mumkin.

5.3.2. NULL cheklovlar emas

NOT NULL cheklovi shunchaki ustun NULL bo'lishi mumkin emasligini ko'rsatadi. Sintaksis misoli:

TABLE mahsulotlarini yarating (product_no integer) Yo'q , matnni nomlang Yo'q , narx raqamli);

NOT NULL cheklovi har doim ustun cheklovi sifatida yoziladi va funktsional jihatdan CHECK ( ustun_nomi IS NULL emas), ammo aniq NOT NULL cheklovi PostgreSQL-da yanada samarali ishlaydi. Biroq, bunday yozuvning kamchiliklari bor - siz bunday cheklovlarga nom berolmaysiz.

Tabiiyki, siz ustun uchun bir nechta cheklovlarni belgilashingiz mumkin. Buning uchun siz ularni birma-bir belgilashingiz kerak:

TABLE mahsulotlarini yarating (product_no integer NOT NULL, ism matni NULL, narx raqamli NOT NULL CHECK (narx\u003e 0));

Bu erda buyurtma muhim emas, bu cheklovlar tekshiriladigan tartibga mos kelishi shart emas.

NOT NULL cheklovining teskarisi ham mavjud: NULL cheklovi. Bu ustun faqat NULL bo'lishi kerak degani emas, bu albatta ma'nosiz bo'ladi. Uning mohiyati ustun NULL bo'lishi mumkin bo'lgan oddiy ko'rsatmada (bu odatiy xatti-harakatlar). SQL standartida NULL cheklovi mavjud emas va uni ko'chma dasturlarda ishlatmaslik kerak. (Postgres Pro-ga faqat ba'zi boshqa DBMS-lar bilan mosligi uchun qo'shilgan.) Ammo ba'zi foydalanuvchilar undan foydalanishni yaxshi ko'radilar, chunki bu sizga skriptdagi cheklovlarni osongina almashtirishga imkon beradi. Masalan, quyidagidan boshlashingiz mumkin:

TABLE mahsulotlarini CREATE (product_no integer NULL, nom matni NULL, narx raqamli NULL);

keyin kerakli joyga NOT kalit so'zini kiriting.

tezkor

Ma'lumotlar bazalarini loyihalashda ustunlarning aksariyati NULL emas deb belgilanishi kerak.

5.3.3. O'ziga xoslik cheklovlari

Noyob cheklovlar ma'lum bir ustun yoki ustunlar guruhidagi ma'lumotlar jadvalning barcha qatorlarida noyob bo'lishini ta'minlaydi. Cheklov quyidagicha yozilgan:

TABLE mahsulotlarini yarating (product_no integer) Noyob

ustun cheklovi va shunga o'xshash:

TABLE mahsulotlarini yarating (tamsayı_no, nom matni, raqamli narx, UNIQUE (product_no) );

stol cheklovi sifatida.

Ustunlar guruhi uchun o'ziga xos cheklovni aniqlash uchun uni vergul bilan ajratilgan ustun nomlarini ajratib, jadval cheklovi sifatida yozing:

Yagona (a, c) );

Ushbu cheklash shuni ko'rsatadiki, ro'yxatdagi ustunlar qiymatlari kombinatsiyasi butun jadvalda yagona bo'lishi kerak, har bir ustunning qiymatlari alohida bo'lmasligi kerak (va odatda bo'lmaydi).

Siz noyob cheklovni odatiy tarzda nomlashingiz mumkin:

TABLE mahsulotlarini yarating (product_no integer) CONSTRAINT har xil bo'lishi kerak UNIQUE, ism matni, narx raqamli);

Noyob cheklovni qo'shish avtomatik ravishda cheklovda ko'rsatilgan ustun yoki ustunlar guruhi uchun noyob B-daraxt indeksini yaratadi. Faqat ba'zi qatorlarga taalluqli bo'lgan noyob shartni noyob cheklov sifatida yozib bo'lmaydi, lekin uni noyob qisman indeks yaratish orqali o'rnatish mumkin.

Umuman aytganda, jadvalda cheklovga kiritilgan barcha ustunlar uchun bir xil qiymatlarga ega bo'lgan bir nechta satrlar mavjud bo'lsa, o'ziga xoslik cheklovi buziladi. Biroq, taqqoslaganda ikkita NULL qiymati hech qachon teng deb hisoblanmaydi. Bu shuni anglatadiki, agar jadvalda noyob cheklov mavjud bo'lsa ham, cheklash ustunlaridan birida yoki bir nechtasida NULL bo'lsa, takrorlanadigan qiymatlar bilan qatorlarni saqlashingiz mumkin. Ushbu xatti-harakatlar SQL standartiga amal qiladi, ammo biz boshqacha yo'l tutadigan DBMSlar haqida eshitdik. Portativ dasturlarni ishlab chiqishda buni yodda tuting.

5.3.4. Asosiy kalitlar

Asosiy kalit cheklovi shuni anglatadiki, tarkibiy ustun yoki ustunlar guruhi jadvaldagi satrlar uchun noyob identifikator bo'lishi mumkin. Buning uchun qadriyatlar noyob va nolga teng bo'lishni talab qiladi. Shunday qilib, quyidagi ikkita ta'rifga ega jadvallar bir xil ma'lumotlarni qabul qiladi:

TABLE mahsulotlarini yarating (product_no integer UNIQUE NOT NULL, nomi matni, narxi raqamli); TABLE mahsulotlarini yarating (product_no integer) Boshlang'ich kalit , ism matni, narx raqamli);

Birlamchi kalitlarga bir nechta ustunlar kirishi mumkin; sintaksis noyoblik cheklovlarini yozishga o'xshaydi:

CREATE TABLE misoli (a integer, b integer, c integer, Boshlang'ich kalit (a, c) );

Birlamchi kalit qo'shilganda, birlamchi kalitda ko'rsatilgan ustun yoki ustunlar guruhi uchun avtomatik ravishda noyob B-daraxt indeksi yaratiladi va bu ustunlar NOT NULL deb belgilanadi.

Jadvalda maksimal bitta asosiy kalit bo'lishi mumkin. (Funktsional jihatdan deyarli birlamchi kalitlarga teng keladigan har qanday o'ziga xoslik cheklovlari va NOT NULL cheklovlar bo'lishi mumkin, ammo siz ulardan birini faqat asosiy kalit cheklovi sifatida tayinlashingiz mumkin.) Relyatsion ma'lumotlar bazasi nazariyasi har bir jadvalda asosiy kalit bo'lishi kerakligini aytadi. Postgres Pro-da bunday qat'iy talab yo'q, lekin odatda unga rioya qilish yaxshidir.

Birlamchi kalitlar ham hujjatlar, ham mijoz dasturlari uchun foydalidir. Masalan, jadval tarkibini tahrirlash qobiliyatiga ega bo'lgan grafik dastur, ehtimol uning satrlarini noyob aniqlash uchun jadvalning asosiy kalitini bilishi kerak bo'ladi. Birlamchi kalitlar DBMS-da boshqa foydalanish usullarini ham topadi; xususan, jadvaldagi birlamchi kalit ushbu jadvalga havola qilingan chet el kalitlari uchun standart maqsad ustunlarini belgilaydi.

5.3.5. Chet el kalitlari

Chet el kalitini cheklash ustun (yoki ustunlar guruhi) qiymatlari boshqa jadvalning ba'zi satrlaridagi qiymatlarga mos kelishi kerakligini aniqlaydi. U deyiladi ma'lumotnoma yaxlitligi ikkita tegishli jadval.

Sizda ilgari biz ko'p marta ishlatgan mahsulotlar jadvali bor deb taxmin qiling:

TABLE mahsulotlarini yarating (product_no integer PRIMARY KEY, ism matni, narx raqamli);

Sizda ushbu mahsulotlarga buyurtmalar yozilgan jadval bor deb taxmin qilaylik. Biz faqat buyurtma jadvalida faqat mavjud bo'lgan mahsulotlarning buyurtmalarini o'z ichiga olishni xohlaymiz. Shuning uchun biz mahsulot jadvaliga taalluqli bo'lgan tashqi kalit cheklovini aniqlaymiz:

ADABIYOTLAR mahsuloti (product_no) , butun son);

Ushbu cheklov bilan mahsulot jadvalida bo'lmagan (va NULLga teng bo'lmagan) product_no qiymatiga ega buyurtma yaratish imkonsiz bo'ladi.

Bunday sxemada buyurtmalar jadvali chaqiriladi bo'ysunuvchi stol va mahsulotlar - asosiy... Shunga ko'ra, ustunlar shuningdek, bo'ysunuvchi va asosiy (yoki havola va maqsad) deb nomlanadi.

Oldingi buyruqni shunday qisqartirish mumkin:

Jadval buyurtmalarini yarating (order_id integer PRIMARY KEY, product_no integer MA'LUMOTLAR mahsuloti , butun son);

ya'ni ustunlar ro'yxatini tashlab qo'ysangiz, tashqi kalit asosiy jadvalning asosiy kaliti bilan bevosita bog'liqdir.

Chet el kaliti ustunlar guruhiga ham murojaat qilishi mumkin. Bunday holda, u odatdagi jadval cheklovi sifatida yozilishi kerak. Masalan:

JADVAL yarating t1 (tamsayı PRIMARY KEY, b integer, c integer, Chet el kalit (b, c) ADABIYOTLAR other_table (c1, c2) );

Tabiiyki, cheklovdagi ustunlar soni va turlari maqsad ustunlar soni va turlariga mos kelishi kerak.

Chet tugmachani cheklashini standart usulda nomlashingiz mumkin.

Jadvalda bir nechta chet el kalitlari cheklovlari bo'lishi mumkin. Bu ko'pdan ko'plarga jadval munosabatlari uchun foydalidir. Aytaylik, sizda mahsulotlar va buyurtmalar jadvallari bor, lekin bitta buyurtma bir nechta mahsulotni o'z ichiga olishi kerak (bu avvalgi sxemada bu mumkin emas). Buning uchun siz quyidagi sxemadan foydalanishingiz mumkin:

TABLE mahsulotlarini yarating (product_no integer PRIMARY KEY, ism matni, narx raqamli); TABLE buyurtmalarini yaratish (order_id integer PRIMARY KEY, shipping_address text, ...); TABLE buyurtma elementlarini yarating (product_no integer REFERENCES products, order_id integer REFERENCES order, number integer, PRIMARY KEY (product_no, order_id));

E'tibor bering, oxirgi jadvalda asosiy kalit chet el kalitlarini qamrab oladi.

Biz bilamizki, chet el kalitlari hech qanday mahsulotga aloqador bo'lmagan buyurtmalarni yaratishga xalaqit beradi. Ammo ma'lum bir mahsulot bilan buyurtmalar yaratgandan so'ng, biz uni o'chirishni xohlasak nima bo'ladi? SQL ushbu vaziyatni hal qiladi. Sezgi quyidagi xatti-harakatlarni taklif qiladi:

    Mahsulotni olib tashlashni oldini olish

    Tegishli buyurtmalarni ham o'chirib tashlang

    Boshqa bir narsa?

Tasdiqlash uchun yuqoridagi misolda quyidagi xatti-harakatni amalga oshiraylik: Buyurtmalarga havola qilingan mahsulotni (order_items jadvali orqali) o'chirishga harakat qilsak, biz ushbu operatsiyani o'chirib qo'yamiz. Agar kimdir buyurtmani o'chirmoqchi bo'lsa, unda uning tarkibi ham o'chiriladi:

TABLE mahsulotlarini yarating (product_no integer PRIMARY KEY, ism matni, narx raqamli); TABLE buyurtmalarini yaratish (order_id integer PRIMARY KEY, shipping_address text, ...); TABLE buyurtma elementlarini yarating (mahsulot_to'liq sonli MA'LUMOTLAR mahsuloti O'chirish cheklovida , order_id integer REFERANSLAR buyurtmalari KASKADNI O'CHIRISH , butun son, PRIMARY KEY (product_no, order_id));

Chegaralash va kaskadli o'chirish - bu eng keng tarqalgan ikkita variant. RESTRICT tegishli qatorni o'chirilishini oldini oladi. HARAKAT YO'Q, agar cheklovni tekshirishda qaram qatorlar mavjud bo'lib tursa, xatolik yuz beradi (bu odatiy xatti-harakatlar). (Ushbu ikkita variantning asosiy farqi shundaki, YO'Q HARAKAT sizga tranzaksiya paytida tasdiqlashni kechiktirishga imkon beradi, ammo RESTRICT bunga imkon bermaydi.) CASCADE shuni ko'rsatadiki, tegishli qatorlarni o'chirishda ularning qaramlari ham avtomatik ravishda o'chiriladi. Yana ikkita variant mavjud: SET NULL va SET DEFAULT. Bog'liq qatorlarni o'chirishda ular sub'ekt jadvalidagi qaram ustunlarga mos ravishda NULL yoki standart qiymatlarni belgilaydilar. E'tibor bering, bu cheklov buzilishiga sabab bo'lmaydi. Masalan, agar harakat sifatida SET DEFAULT ko'rsatilgan bo'lsa, lekin standart qiymat tashqi kalit cheklovini qondirmasa, amal bajarilmaydi.

ON DELETE bayonotiga o'xshab, belgilangan ustun o'zgarganda ishga tushiriladigan ON UPDATE mavjud. Bunday holda, mumkin bo'lgan harakatlar bir xil, ammo CASCADE bu holda tegishli ustunlarning o'zgartirilgan qiymatlari qaram qatorlarga ko'chirilishini anglatadi.

Odatda, bog'liq satrlardan biri NULL bo'lsa, qaram qatorda tashqi kalit cheklovini qondirish shart emas. Agar tashqi kalit e'loniga MATCH FULL qo'shilsa, mag'lubiyat faqatgina barcha tegishli ustunlar NULL (ya'ni turli qiymatlar uchun (NULL va NULL bo'lmagan) bo'lsa, MATCH FULL cheklovi bajarilmasligi kafolatlanadi). Agar siz bog'liq qatorlarni ushbu cheklovdan qochib qutula olmasligini istasangiz, tegishli ustunlarni NOT NULL deb e'lon qiling.

Tashqi kalit asosiy kalitni yoki noyob cheklovni tashkil etuvchi ustunlarga murojaat qilishi kerak. Shunday qilib, bog'langan ustunlar uchun har doim indeks bo'ladi (tegishli asosiy kalit yoki cheklash bilan belgilanadi), bu bog'langan qatorda mos keladigan tekshiruvlar samarali bajarilishini anglatadi. Asosiy jadval satrlari uchun DELETE buyruqlari yoki qaram ustunlar uchun UPDATE buyruqlari bo'ysunuvchi jadvalni skanerlashni va eski qadriyatlarga havola qilingan qatorlarni topishni talab qilishi sababli, bo'ysunuvchi ustunlar uchun ham indeks bo'lishi foydalidir. Ammo bu har doim ham zarur emas va tegishli indeksni yaratishning turli xil usullari mavjud, shuning uchun tashqi kalit deklaratsiyasi o'zaro bog'liq ustunlarda indeksni avtomatik ravishda yaratmaydi.

Sizning e'tiboringizga yangi boshlanuvchilar uchun 2-qism SQL maqolasining bepul tarjimasini taqdim etaman

Har bir veb-ishlab chiquvchi uchun ma'lumotlar bazalari bilan o'zaro aloqada bo'lish muhimdir. Ikkinchi qismda biz tilni o'rganishni davom ettirmoqdamiz SQL va bizning mahoratimizni MBBga tatbiq etish MySQL... Biz indekslar, ma'lumotlar turlari va yanada murakkab so'rovlar bilan tanishamiz.

Sizga nima kerak

Iltimos, birinchi qismning "Sizga kerak bo'lgan" bo'limiga qarang.

Agar siz yuqoridagi misollarni serveringizda ishlatmoqchi bo'lsangiz, quyidagilarni bajaring:

  1. Konsolni oching MySQL va tizimga kiring.
  2. So'rovlar yordamida "my_first_db" ma'lumotlar bazasini yarating YARATMOQagar u ilgari yaratilmagan bo'lsa.
  3. Operator yordamida bazani o'zgartiring FOYDALANISH.

Ko'rsatkichlar

Indekslar (yoki tugmachalar) odatda ma'lumot olib keladigan (masalan,) bayonotlarning bajarilishini tezlashtirish uchun ishlatiladi SELECT) jadvallardan.

Ular ma'lumotlar bazasining yaxshi arxitekturasining muhim qismidir va ularni "optimallashtirish" deb tasniflash qiyin. Ko'rsatkichlar odatda dastlab qo'shiladi, ammo keyinchalik so'rov yordamida qo'shilishi mumkin O'zgartirish jadvali.

Ma'lumotlar bazasi ustunlarini indeksatsiya qilishning asosiy sabablari:

  • Deyarli har bir jadvalda asosiy kalit mavjud ( Boshlang'ich kalit), odatda "id" ustuni.
  • Agar ustun noyob qiymatlarni saqlashi kerak bo'lsa, unda noyob indeks bo'lishi kerak ( Noyob).
  • Agar sizga ustunda tez-tez qidirish kerak bo'lsa (uni jumla yordamida) Qaerda), u muntazam indeksga ega bo'lishi kerak ( INDEKS).
  • Agar ustun boshqa jadval bilan bog'lanish uchun ishlatilsa, u iloji boricha tashqi kalit bo'lishi kerak ( Chet el kaliti) yoki oddiy indeks.

Asosiy kalit (PRIMARY KEY)

Deyarli barcha jadvallarda birlamchi kalit mavjud, odatda avtomatik o'sish opsiyasi bilan butun son ( AUTO_INCREMET).

Ko'pincha, pastki so'rovlar ishlashning sezilarli darajada pasayishiga olib keladi, shuning uchun ularni ehtiyotkorlik bilan ishlating.

UNION: Ma'lumotlarni birlashtirish

So'rov yordamida Ittifoq, siz bir nechta SELECT so'rovlarining natijalarini birlashtira olasiz.

Ushbu misol "N" harfi bilan boshlangan holatlarni ko'p sonli davlatlar bilan birlashtiradi:

(SELECT * FROM holatlari "n%" kabi QAYERDA nomi)) UNION (SELECT * FROM shtatlari WHERE populyatsiyasi\u003e 10000000);

E'tibor bering, Nyu-York yirik shtat bo'lib, "N" harfi bilan boshlanadi. Biroq, bu ro'yxatda faqat bir marta paydo bo'ladi, chunki dublikatlar avtomatik ravishda o'chiriladi.

Faqat so'rovlarning go'zalligi Ittifoq so'rovlarni turli jadvallarga qarshi birlashtirish uchun ishlatilishi mumkinligi.

Masalan, bizda xodimlar, menejerlar va mijozlar jadvallari mavjud. Har bir jadvalda elektron pochta manzili ko'rsatilgan maydon mavjud. Agar biz barcha elektron pochta manzillarini bitta so'rovda olishni istasak, quyidagicha harakat qilishimiz mumkin:

(Xodimlardan elektron pochtani tanlang) UNION (menejerlardan elektron pochtani tanlang) UNION (SELECT email FROM customers from WHERE subscriped \u003d 1);

Ushbu so'rovni bajargandan so'ng, biz barcha xodimlar va menejerlarning pochta manzillarini olamiz va faqat xabarnomaga obuna bo'lgan mijozlar.

INSERT Davomi

Biz allaqachon so'rov haqida gaplashdik KIRITMOQ oldingi maqolada. Indekslarni ko'rib chiqqandan so'ng, qo'shimcha so'rov imkoniyatlari haqida gaplashishimiz mumkin. KIRITMOQ.

INSERT ... DUPLICATE ASOSIY YANGILASH

Bu eng ko'p ishlatiladigan shart. Avval so'rov bajarilishga urinadi KIRITMOQva agar so'rov bajarilmasa, takroriy birlamchi ( Boshlang'ich kalit) yoki noyob ( Yagona kalit) tugmachasi, keyin so'rov bajariladi YANGILASH.

Avval test jadvalini tuzamiz.

Bu oziq-ovqat mahsulotlarini saqlash stoli. "Stok" maydonida omborda mavjud bo'lgan mahsulotlar soni saqlanadi.

Keling, jadvalga allaqachon mavjud bo'lgan qiymatni kiritishga harakat qilaylik va nima bo'lishini ko'raylik.

Xatolik yuz berdi.

Aytaylik, biz yangi novvoyxona oldik va ma'lumotlar bazasini yangilamoqchimiz, lekin ma'lumotlar bazasida allaqachon yozuv bor-yo'qligini bilmaymiz. Avval yozuvning mavjudligini tekshirib, keyin yana bir qo'shish so'rovini bajarishimiz mumkin. Yoki siz hamma narsani bitta oddiy so'rovda qilishingiz mumkin:

Xuddi shunday ishlaydi KIRITMOQlekin bitta muhim xususiyati bilan. Agar yozuv allaqachon mavjud bo'lsa, u o'chiriladi va so'rov bajariladi KIRITMOQva biz hech qanday xato xabari olmaymiz.

Iltimos, e'tibor bering, chunki mutlaqo yangi qator qo'shiladi, avtokrement maydoni bitta ko'paytiriladi.

Bu, birinchi navbatda, dasturning bajarilishini to'xtatmaslik uchun, takrorlanadigan xatoliklarning oldini olishning bir usuli. Ikki nusxada bo'lsa ham, hech qanday xatoga yo'l qo'ymasdan yangi qatorni kiritish kerak bo'lishi mumkin.

Hech qanday xato va yangilangan satr yo'q.

Ma'lumot turlari

Jadvaldagi har bir ustun ma'lum turdagi bo'lishi kerak. Biz allaqachon turlardan foydalanganmiz INT, VARCHAR va Sanalekin ular haqida batafsil to'xtamadi. Yana bir nechta ma'lumot turlarini ko'rib chiqamiz.

Raqamli ma'lumotlar turlaridan boshlaymiz. Men ularni ikki guruhga ajrataman: Butun va kasrlar.

Butun

Butun sonli ustun faqat tabiiy sonlarni saqlashi mumkin (kasrsiz). Odatiy bo'lib, ular ijobiy yoki salbiy bo'lishi mumkin. Agar parametr tanlangan bo'lsa YO'Q, keyin faqat ijobiy raqamlarni saqlash mumkin.

MySQL har xil o'lchamdagi va diapazondagi 5 turdagi tamsayılarni qo'llab-quvvatlaydi:

Fraksiyonel raqamli ma'lumotlar turlari

Ushbu turlar kasr sonlarini saqlashi mumkin: FLOAT, DOUBLE va DECIMAL.

FLOAT - 4 bayt, DOUBLE - 8 bayt va oldingisiga o'xshash. DOUBLE aniqroq.

DECIMAL (M, N) o'zgaruvchan aniqlikka ega. M - raqamlarning maksimal soni, N - o‘nli kasrdan keyingi raqamlar soni.

Masalan, DECIMAL (13,4) 9 ta o'nlik kasrga va keyin 4 ta songa ega.

String ma'lumotlar turlari

Nomidan ko'rinib turibdiki, ular torlarni saqlashlari mumkin.

CHAR (N) N belgini saqlay oladi va aniqlanadi. Masalan, CHAR (50) har doim butun ustun bo'ylab har bir satrda 50 ta belgidan iborat bo'lishi kerak. Mumkin bo'lgan maksimal qiymat 255 ta belgi

VARCHAR (N) bir xil ishlaydi, ammo diapazon o'zgarishi mumkin. N - maksimal qiymatni bildiradi. Agar saqlangan satr N belgidan qisqaroq bo'lsa, u holda qattiq diskda kam joy egallaydi. Mumkin bo'lgan maksimal qiymat 65535 belgidan iborat.

Uzoq torlar uchun TEXT tipidagi variantlar ko'proq mos keladi. TEXT 65535 ta belgidan iborat, MEDIUMTEXT 16,7 million, LONGTEXT esa 4,3 milliard belgidan iborat. MySQL ularni serverdagi alohida do'konlarda saqlaydi, shunda asosiy do'kon imkon qadar kichikroq va tezroq bo'ladi.

.

Xulosa

Maqolani o'qiganingiz uchun tashakkur. SQL veb-ishlab chiquvchilar arsenalidagi muhim til va vositadir.

Buni baham ko'ring