ძირითადი და მეორადი გასაღებები მონაცემთა ბაზაში. გასაღებები და ინდექსები

ამ სტატიაში ჩვენ შევეცდებით განვიხილოთ ყველაფერი, რაც დაკავშირებულია გასაღებებთან SQL:რისთვის არის გასაღებების შექმნა და შეზღუდვები? ზოგადად: მოსაწყენი იქნება 😉

დღევანდელი გეგმა ასეთია:

რელაციური მონაცემთა ბაზის თეორიაში - გასაღებებიეს არის გარკვეული პირები, რომლებიც შექმნილია გარკვეული შეზღუდვების დასამყარებლად, რომლებიც ინარჩუნებენ მონაცემთა მთლიანობას და ხელმისაწვდომობას მონაცემთა ბაზის ცხრილებში.

მარტივი სიტყვებით, გასაღებები არის sqlშექმნილია სვეტისთვის დამატებითი ფუნქციონირების მითითებისთვის. იქნება ეს უნიკალურობა თუ ის ფაქტი, რომ სვეტი მიუთითებს სხვა ცხრილზე (უცხო გასაღები).

Მთავარი გასაღები

სვეტი, რომელიც უნიკალური უნდა იყოს მონაცემთა ბაზაში, აღინიშნება პირველადი გასაღებით. პირველადი გასაღები ან პირველადი გასაღები ნიშნავს, რომ პირველადი გასაღების სვეტის მნიშვნელობა არ შეიძლება განმეორდეს ცხრილში. ამრიგად, ეს გასაღები საშუალებას გაძლევთ ცალსახად ამოიცნოთ ჩანაწერი ცხრილში, იმის შიშის გარეშე, რომ სვეტის მნიშვნელობა განმეორდება. მხოლოდ მაგალითი: ვთქვათ, რომ თქვენ გაქვთ მომხმარებლების ცხრილი. ამ ცხრილში არის ველები: სრული სახელი, დაბადების წელი, ტელეფონი. როგორ ამოვიცნოთ მომხმარებელი? ისეთი პარამეტრები, როგორიცაა სრული სახელი და ტელეფონის ნომერი, არ შეიძლება იყოს სანდო. ჩვენ ხომ შეიძლება გვყავდეს რამდენიმე მომხმარებელი არა მხოლოდ ერთი და იგივე გვარით, არამედ ერთი და იგივე სახელით. ტელეფონის ნომერი შეიძლება შეიცვალოს დროთა განმავლობაში და ტელეფონის ნომრის მქონე მომხმარებელი შეიძლება არ იყოს ჩვენს მონაცემთა ბაზაში.

სწორედ ამიტომ გამოიგონეს პირველადი გასაღები. ერთხელ მიენიჭა უნიკალური იდენტიფიკატორი და ეს არის ის. IN mySqlრომლის მაგალითზეც ვასრულებთ ყველა მაგალითს ველიდან AUTO_INCREMENTდაყენება შეუძლებელია, თუ არ მიუთითებთ, რომ ეს არის ძირითადი გასაღები.

ვფიქრობ, არ ღირს იმის აღნიშვნა, რომ ჩანაწერის შექმნისას ველი არ შეიძლება იყოს ცარიელი.

გარე გასაღები ( უცხოური გასაღები)

კიდევ არის კიდევ გარე გასაღები (უცხოური გასაღები). მას ასევე უწოდებენ მითითებას. საჭიროა ცხრილების ერთმანეთთან დაკავშირება.

თუ დააკვირდებით ზემოთ მოცემულ სურათს, უცხო გასაღები იქნება მიმწოდებლის ველი ფეხსაცმლის ცხრილში. როგორც წესი, ცხრილის შექმნისას თქვენ აკონკრეტებთ უნიკალური მთელი რიცხვების სვეტს. როგორ გავაკეთეთ ეს ცხრილის შექმნისას მიმწოდებელი

სვეტი მომწოდებელი_იდენტიფიკატორიუნიკალური იქნება თითოეული ჩანაწერისთვის. მისი მნიშვნელობა გამოჩნდება სვეტში პროვაიდერიმაგიდაზე ფეხსაცმელი.მე გთავაზობთ დაუყოვნებლივ გადახედოთ მაგალითს, თუ როგორ იქმნება უცხო გასაღები.

უცხოური გასაღების შექმნა

შექმნა მაგიდის ფეხსაცმელი(shoes_id int auto_increment პირველადი გასაღები, სათაურის ტექსტი, ზომა int, ფასი float, count int, ტიპი varchar(30), მომწოდებელი int, უცხო გასაღები (მიმწოდებელი) მითითებები მომწოდებელი (supplier_id));

როგორც ზემოთ მოყვანილ მაგალითში ხედავთ, უცხო გასაღების შექმნის სინტაქსი საკმაოდ მარტივია. თქვენ უნდა დაამატოთ ველი მაგიდაზე, შემდეგ კი გამოაცხადოთ ეს ველი, როგორც უცხო გასაღები და მიუთითოთ სად მიმართავს. ამ შემთხვევაში ველი მიმწოდებელიმიმართავს სფეროს მომწოდებელი_იდენტიფიკატორიმაგიდაზე მიმწოდებელი

კომპოზიტური გასაღები (კომპოზიტური გასაღები)

რაც შეეხება კომპოზიციურ გასაღებს, ეს არის რამდენიმე ძირითადი გასაღები ცხრილში. ამრიგად, რომელმაც შექმნა კომპოზიტური გასაღები, ჩანაწერის უნიკალურობა შემოწმდება ველებით, რომლებიც გაერთიანებულია ამ კლავიშში.

არის სიტუაციები, როდესაც ცხრილში ჩასმისას საჭიროა ჩანაწერის უნიკალურობის შემოწმება ერთდროულად რამდენიმე ველის გამოყენებით. სწორედ ამიტომ გამოიგონეს კომპოზიციური გასაღები. მაგალითად, მე შევქმნი მარტივ ცხრილს კომპოზიტური გასაღები სინტაქსის საჩვენებლად:

ცხრილის ტესტის შექმნა (field_1 int, field_2 text, field_3 bigint, პირველადი გასაღები (field_1, field_3));

ზემოთ მოყვანილ მაგალითში ორი ველი გაერთიანებულია კომპოზიციურ გასაღებად და ცხრილში არ იქნება ჩანაწერები ამ იდენტური ველებით.

ეს ყველაფერი გასაღებებზეა SQL.ეს მცირე გაკვეთილი არის მომზადება სტატიისთვის, სადაც დეტალურად განვიხილავთ, თუ როგორ გავაერთიანოთ ცხრილები ისე, რომ მათ შექმნან ერთიანი მონაცემთა ბაზა.

ის ეხება: SQL სერვერი (2016 წლიდან) Azure SQL მონაცემთა ბაზაAzure SQL მონაცემთა საწყობი პარალელური მონაცემთა საწყობი

ძირითადი და უცხოური გასაღებები არის ორი ტიპის შეზღუდვა, რომელიც შეიძლება გამოყენებულ იქნას მონაცემთა მთლიანობის უზრუნველსაყოფად SQL Server ცხრილებში. ეს არის მონაცემთა ბაზის მნიშვნელოვანი ობიექტები.

ეს თემა განიხილება შემდეგ განყოფილებებში.

ძირითადი ძირითადი შეზღუდვები

საგარეო გასაღების შეზღუდვები

დაკავშირებული ამოცანები

როგორც წესი, ცხრილს აქვს სვეტი ან სვეტების კომბინაცია, რომელიც შეიცავს მნიშვნელობებს, რომლებიც ცალსახად იდენტიფიცირებენ ცხრილის თითოეულ მწკრივს. ამ სვეტს ან სვეტებს ცხრილის პირველადი გასაღები (PK) ეწოდება და უზრუნველყოფს ცხრილის ერთეულს მთლიანობას. ძირითადი გასაღების შეზღუდვები ხშირად განისაზღვრება საიდენტიფიკაციო სვეტზე, რადგან ისინი უზრუნველყოფენ მონაცემთა უნიკალურობას.

როდესაც კომპონენტში აყენებთ პირველადი გასაღების შეზღუდვას მაგიდაზე, მონაცემთა ბაზის ძრავა უზრუნველყოფს მონაცემთა უნიკალურობას პირველადი გასაღების სვეტებზე უნიკალური ინდექსის ავტომატურად შექმნით. ეს ინდექსი ასევე უზრუნველყოფს მონაცემებზე სწრაფ წვდომას შეკითხვებში პირველადი გასაღების გამოყენებისას. თუ ძირითადი გასაღების შეზღუდვა განსაზღვრულია ერთზე მეტ სვეტზე, მნიშვნელობები შეიძლება განმეორდეს იმავე სვეტში, მაგრამ ძირითადი გასაღების შეზღუდვის განსაზღვრაში ყველა სვეტის მნიშვნელობების თითოეული კომბინაცია უნიკალური უნდა იყოს.

როგორც ნაჩვენებია შემდეგ სურათზე, სვეტები პროდუქტის IDდა გამყიდველის IDმაგიდაზე შესყიდვა.პროდუქტის გამყიდველიშექმენით რთული პირველადი გასაღების შეზღუდვა მოცემული ცხრილისთვის. ეს უზრუნველყოფს ცხრილის თითოეულ მწკრივს პროდუქტის გამყიდველიაქვს მნიშვნელობების უნიკალური კომბინაცია პროდუქტის IDდა გამყიდველის ID. ეს ხელს უშლის დუბლიკატი რიგების ჩასმას.

    ცხრილს შეიძლება ჰქონდეს მხოლოდ ერთი ძირითადი გასაღების შეზღუდვა.

    პირველადი გასაღები არ შეიძლება ჰქონდეს 16 სვეტზე მეტი, ხოლო გასაღების მთლიანი სიგრძე არ უნდა აღემატებოდეს 900 ბაიტს.

    პირველადი გასაღების შეზღუდვით ჩამოყალიბებული ინდექსი არ შეიძლება გამოიწვიოს ცხრილის ინდექსების რაოდენობამ გადააჭარბოს 999 არაკლასტერული ინდექსისა და 1 კლასტერული ინდექსის ლიმიტს.

    თუ პირველადი გასაღების შეზღუდვა არ აკონკრეტებს, არის თუ არა ინდექსი კლასტერული თუ არაკლასტერული, იქმნება კლასტერული ინდექსი, თუ ის არ არსებობს მაგიდაზე.

    ყველა სვეტი პირველადი გასაღების შეზღუდვით უნდა განისაზღვროს, როგორც არამდგრადი. თუ nullability არ არის მითითებული, მაშინ ყველა სვეტი პირველადი გასაღების შეზღუდვით დაყენებულია არა-nullable.

    თუ პირველადი გასაღები განსაზღვრულია CLR მომხმარებლის მიერ განსაზღვრული მონაცემთა ტიპის სვეტზე, ამ ტიპის განხორციელებამ უნდა უზრუნველყოს ორობითი დახარისხება.

უცხო გასაღები (FK) არის სვეტი ან სვეტების კომბინაცია, რომელიც გამოიყენება ორ ცხრილის მონაცემებს შორის ურთიერთობის იძულებისთვის, რათა აკონტროლოს მონაცემები, რომლებიც შეიძლება შეინახოს უცხო გასაღების ცხრილში. თუ ერთი ან მეტი სვეტი, რომელიც შეიცავს ერთი ცხრილის ძირითად გასაღებს, მითითებულია სხვა ცხრილის ერთ ან მეტ სვეტში, უცხო გასაღების ბმული ქმნის ურთიერთობას ორ ცხრილს შორის. ეს სვეტი ხდება უცხო გასაღები მეორე ცხრილში.

მაგალითად, მაგიდა Sales.SalesOrderHeaderდაკავშირებულია მაგიდასთან გაყიდვები.გამყიდველიუცხოური გასაღების გამოყენებით, რადგან არსებობს ლოგიკური ურთიერთობა გაყიდვების შეკვეთებსა და გაყიდვების მენეჯერებს შორის. სვეტი გამყიდველის IDმაგიდაზე Sales.SalesOrderHeaderემთხვევა ცხრილის პირველადი გასაღების სვეტს გამყიდველი. სვეტი გამყიდველის IDმაგიდაზე Sales.SalesOrderHeaderარის მაგიდის უცხო გასაღები გამყიდველი. ამ ურთიერთობის დამყარებით უცხო გასაღების გამოყენებით, მნიშვნელობა for გამყიდველის IDცხრილში ჩასმა შეუძლებელია SalesOrderHeader, თუ ის ამჟამად არ არის მოცემულ ცხრილში გამყიდველი.

ცხრილებისა და სვეტების მაქსიმალური რაოდენობა, რომლებზეც ცხრილმა შეიძლება მოიხსენიოს, როგორც უცხოური გასაღებები (გამავალი მითითებები) არის 253. SQL Server 2016 ზრდის ლიმიტს სხვა ცხრილებისა და სვეტების რაოდენობაზე, რომლებსაც შეუძლიათ იმავე ცხრილის სვეტების მითითება (შემავალი მითითებები) 253-დან 10000-მდე (საჭიროებს თავსებადობის დონეს მინიმუმ 130.) გადიდება ექვემდებარება შემდეგ შეზღუდვებს:

    253-ზე მეტი უცხო გასაღების მითითება მხარდაჭერილია მხოლოდ DML DELETE ოპერაციებისთვის. განახლების და შერწყმის ოპერაციები არ არის მხარდაჭერილი.

    253-ზე მეტი უცხო გასაღების მითითება ამჟამად მიუწვდომელია სვეტების მაღაზიის ინდექსებისთვის, მეხსიერებით ოპტიმიზებული ცხრილებისთვის, Stretch მონაცემთა ბაზაში ან უცხო გასაღების დაყოფილ ცხრილებზე.

ინდექსები საგარეო საკვანძო შეზღუდვებში

ძირითადი გასაღების შეზღუდვებისგან განსხვავებით, როდესაც თქვენ ქმნით უცხო გასაღების შეზღუდვას, შესაბამისი ინდექსი ავტომატურად არ იქმნება. თუმცა, ხშირად საჭიროა უცხოურ გასაღებზე ინდექსის ხელით შექმნა შემდეგი მიზეზების გამო:

    საკვანძო უცხოური სვეტები ხშირად გამოიყენება შეერთების კრიტერიუმებში, როდესაც ისინი ერთად გამოიყენება შესაბამისი ცხრილებიდან მონაცემების მოსაძიებლად. ეს განხორციელებულია ერთ ცხრილში უცხო გასაღების შეზღუდვის სვეტის ან სვეტების რუკების გამოსახვით მეორე ცხრილის ერთ ან რამდენიმე ძირითად ან უნიკალურ კლავიშის სვეტზე. ინდექსი საშუალებას აძლევს მონაცემთა ბაზის ძრავას სწრაფად მოძებნოს დაკავშირებული მონაცემები უცხო გასაღების ცხრილში. თუმცა, ინდექსის შექმნა სავალდებულო არ არის. ორი დაკავშირებული ცხრილის მონაცემები შეიძლება გაერთიანდეს მაშინაც კი, თუ ცხრილებს შორის არ არის განსაზღვრული პირველადი გასაღები ან უცხო გასაღების შეზღუდვები, მაგრამ უცხო გასაღების ურთიერთობა ორ ცხრილს შორის მიუთითებს, რომ ორი ცხრილი ოპტიმიზირებულია ერთად გამოსაყენებლად მოთხოვნაში, რომელიც იყენებს გასაღებებს. როგორც კრიტერიუმები.

    უცხოური გასაღების შეზღუდვები ამოწმებს ცვლილებებს პირველადი გასაღების შეზღუდვებში შესაბამის ცხრილებზე.

რეფერენციული მთლიანობა

უცხო გასაღების შეზღუდვის მთავარი მიზანია აკონტროლოს მონაცემები, რომლებიც შეიძლება შეინახოს უცხო გასაღების ცხრილში, მაგრამ შეზღუდვა ასევე აკონტროლებს პირველადი გასაღების ცხრილის მონაცემებში ცვლილებებს. მაგალითად, თუ ცხრილიდან წაშლით გაყიდვების მენეჯერის მწკრივს გაყიდვები.გამყიდველი, რომლის ID გამოიყენება ცხრილში მოცემულ გაყიდვების შეკვეთებში Sales.SalesOrderHeader, ირღვევა ორი ცხრილის რეფერენტული მთლიანობა. დისტანციური მენეჯერის გაყიდვების შეკვეთები ცხრილში SalesOrderHeaderცხრილის მონაცემებთან კავშირის გარეშე გახდება არასწორი გამყიდველი.

უცხო გასაღების შეზღუდვა ხელს უშლის ამ სიტუაციის წარმოქმნას. შეზღუდვა ახორციელებს რეფერენციულ მთლიანობას შემდეგნაირად: ის ხელს უშლის პირველადი გასაღების ცხრილის მონაცემებში ცვლილებებს, თუ ასეთი ცვლილებები გააუქმებს ბმულს უცხო გასაღების ცხრილში. თუ თქვენ ცდილობთ წაშალოთ მწკრივი პირველადი გასაღების ცხრილში ან შეცვალოთ ამ გასაღების მნიშვნელობა, თუ აღმოაჩენთ, რომ წაშლილ ან შეცვლილ პირველადი გასაღების მნიშვნელობას აქვს შესაბამისი მნიშვნელობა უცხო კლავიშის შეზღუდვაში სხვა ცხრილში, მოქმედება წარუმატებელი იქნება. უცხო გასაღების შეზღუდვით მწკრივის წარმატებით შესაცვლელად ან წასაშლელად, ჯერ უნდა წაშალოთ უცხო გასაღების მონაცემები უცხოური გასაღების ცხრილში ან შეცვალოთ მონაცემები უცხო გასაღების ცხრილში, რომელიც აკავშირებს უცხო გასაღების მონაცემებს სხვა პირველადი გასაღების მონაცემებთან.

კასკადური რეფერენციალური მთლიანობა

კასკადური რეფერენციალური მთლიანობის შეზღუდვების გამოყენებით, შეგიძლიათ განსაზღვროთ ის მოქმედებები, რომლებსაც განახორციელებს მონაცემთა ბაზის ძრავა, როდესაც მომხმარებელი ცდილობს წაშალოს ან განაახლოს გასაღები, რომელზეც მითითებულია ჯერ კიდევ არსებული უცხო კლავიშები. შეიძლება განისაზღვროს შემდეგი კასკადური მოქმედებები.

არანაირი მოქმედება
მონაცემთა ბაზის ძრავა ქმნის შეცდომას და შემდეგ აბრუნებს წაშლის ან განახლების ოპერაციას მშობლის ცხრილის მწკრივზე.

კასკადი
შესაბამისი რიგები განახლდება ან წაიშლება მითითების ცხრილიდან, თუ ეს მწკრივი განახლდება ან წაიშლება მშობელი ცხრილიდან. CASCADE მნიშვნელობის დაზუსტება შეუძლებელია, თუ სვეტი არის ტიპის დროის შტამპიარის უცხოური ან საცნობარო გასაღების ნაწილი. ON DELETE CASCADE ქმედება არ შეიძლება განისაზღვროს მაგიდაზე, რომელსაც აქვს განსაზღვრული ტრიგერის ნაცვლად DELETE. ON UPDATE CASCADE პუნქტი არ შეიძლება იყოს მითითებული ცხრილებზე, რომლებშიც მითითებულია განახლების ნაცვლად ტრიგერები.

SET NULL
ყველა მნიშვნელობა, რომელიც ქმნის უცხო კლავიშს, დაყენებულია NULL-ზე, როდესაც მშობლის ცხრილის შესაბამისი მწკრივი განახლდება ან წაიშლება. ამ შეზღუდვის დასაკმაყოფილებლად, უცხო გასაღების სვეტები უნდა იყოს ნულოვანი. არ შეიძლება დაყენდეს ცხრილებზე, რომლებშიც მითითებულია განახლების ნაცვლად ტრიგერები.

ნაგულისხმევი დაყენება
ყველა მნიშვნელობა, რომელიც ქმნის უცხო კლავიშს, დაყენებულია ნაგულისხმევ მნიშვნელობაზე, როდესაც მშობლის ცხრილის შესაბამისი მწკრივი წაიშლება ან განახლდება. ამ შეზღუდვის დასაკმაყოფილებლად, ყველა უცხო გასაღების სვეტს უნდა ჰქონდეს ნაგულისხმევი განმარტებები. თუ სვეტი არის nullable და ნაგულისხმევი მნიშვნელობა არ არის აშკარად განსაზღვრული, სვეტის ნაგულისხმევი მნიშვნელობა ხდება NULL. არ შეიძლება დაყენდეს ცხრილებზე, რომლებშიც მითითებულია განახლების ნაცვლად ტრიგერები.

საკვანძო სიტყვები CASCADE, SET NULL, SET DEFAULT და NO ACTION შეიძლება გაერთიანდეს ცხრილებში, რომლებსაც აქვთ ურთიერთმიმართების ურთიერთობა. თუ მონაცემთა ბაზის ძრავა შეხვდება NO ACTION საკვანძო სიტყვას, ის შეწყვეტს და დააბრუნებს ასოცირებულ CASCADE, SET NULL და SET DEFAULT ოპერაციებს. თუ DELETE განცხადება შეიცავს CASCADE, SET NULL, SET DEFAULT და NO ACTION საკვანძო სიტყვების კომბინაციას, ყველა CASCADE, SET NULL და SET DEFAULT ოპერაცია შესრულდება მანამ, სანამ მონაცემთა ბაზის ძრავა მოიძიებს NO ACTION ოპერაციას.

ტრიგერები და კასკადური მითითების მოქმედებები

კასკადური საცნობარო მოქმედებები გააქტიურებულია განახლების შემდეგ ან წაშლის შემდეგ შემდეგნაირად:

    ყველა კასკადური მითითების მოქმედება, რომელიც უშუალოდ გამოწვეულია ორიგინალური DELETE ან UPDATE განცხადებებით, პირველ რიგში შესრულდება.

    თუ ცხრილებზე არის განსაზღვრული AFTER ტრიგერები, რომლებიც შეიცვალა, ეს ტრიგერები ამოქმედდება ყველა კასკადური მოქმედების დასრულების შემდეგ. ეს იწვევს ცეცხლს კასკადური მოქმედებების საპირისპირო თანმიმდევრობით. თუ ერთი ცხრილისთვის რამდენიმე ტრიგერი არის განსაზღვრული, ისინი შემთხვევითი თანმიმდევრობით ირთვება, თუ ცხრილის პირველი და ბოლო ტრიგერები არ არის არჩეული. ეს თანმიმდევრობა განისაზღვრება პროცედურის მიხედვით.

    თუ კასკადური მოქმედებების თანმიმდევრობები წარმოიქმნება ცხრილიდან, რომელიც იყო DELETE ან UPDATE მოქმედების უშუალო სამიზნე, არ არის განსაზღვრული მოქმედების თანმიმდევრობების ცეცხლის გამომწვევი თანმიმდევრობა. თუმცა, ერთი მოქმედების თანმიმდევრობა ყოველთვის ააქტიურებს მის ყველა ტრიგერს, სანამ შემდეგი მოქმედება მოხდება.

    AFTER ტრიგერი მაგიდაზე, რომელიც იყო DELETE ან UPDATE მოქმედების უშუალო სამიზნე, გააქტიურებულია მიუხედავად იმისა, შეიცვალა თუ არა მწკრივები. ამ შემთხვევაში, სხვა ცხრილები არ იმოქმედებს კასკადით.

    თუ რომელიმე წინა ტრიგერი ასრულებს DELETE ან UPDATE ოპერაციებს სხვა ცხრილებზე, ამ ოპერაციებს შეუძლიათ გამოიწვიონ კასკადური მოქმედებების საკუთარი თანმიმდევრობა. ეს მეორადი მოქმედებების თანმიმდევრობა მუშავდება თითოეული DELETE ან UPDATE ოპერაციისთვის მას შემდეგ, რაც დასრულდება ყველა ძირითადი ქმედების თანმიმდევრობის ტრიგერები. ეს პროცესი შეიძლება განმეორდეს რეკურსიულად შემდგომი DELETE ან UPDATE ოპერაციებისთვის.

    ტრიგერების შიგნით CREATE, ALTER, DELETE ან სხვა DDL ოპერაციების შესრულებამ შეიძლება გამოიწვიოს DDL ტრიგერების გააქტიურება. ამან შეიძლება გამოიწვიოს შემდგომი DELETE ან UPDATE ოპერაციები, რაც დაიწყებს კასკადური მოქმედებების დამატებით თანმიმდევრობას და გაააქტიურებს მათ ტრიგერებს.

    თუ შეცდომა მოხდა კასკადური მითითების მოქმედებების რომელიმე კონკრეტულ თანმიმდევრობაში, ამ თანმიმდევრობაზე AFTER ტრიგერები არ გააქტიურდება და ამ თანმიმდევრობით გენერირებული DELETE ან UPDATE ოპერაციები უკან დაბრუნდება.

    ცხრილს, რომელსაც აქვს განსაზღვრული ტრიგერის ნაცვლად, შეიძლება ჰქონდეს REFERENCES პუნქტი, რომელიც განსაზღვრავს კონკრეტულ კასკადურ მოქმედებას. თუმცა, AFTER ტრიგერს კასკადური მოქმედების სამიზნე ცხრილზე შეუძლია გამოსცეს INSERT, UPDATE ან DELETE განცხადება სხვა მაგიდაზე ან ხედზე, რომელიც ამ ობიექტზე ამუშავებს ტრიგერის ნაცვლად.

შემდეგი ცხრილი ჩამოთვლის საერთო ამოცანებს, რომლებიც დაკავშირებულია პირველადი გასაღებისა და უცხოური გასაღების შეზღუდვებთან.

ნახაზზე ნაჩვენებია ცხრილი (ფარდობა 5 ხარისხით), რომელიც შეიცავს გარკვეულ ინფორმაციას ჰიპოთეტური საწარმოს თანამშრომლების შესახებ. ცხრილის რიგები შეესაბამება ტოპებს. თითოეული მწკრივი რეალურად არის ერთი რეალური სამყაროს ობიექტის (ამ შემთხვევაში, მუშაკის) აღწერა, რომლის მახასიათებლებს შეიცავს სვეტები. რელატიური ურთიერთობები შეესაბამება ერთეულთა სიმრავლეს, ხოლო ტოპები შეესაბამება ერთეულებს. ცხრილის სვეტები, რომლებიც წარმოადგენენ მიმართებით ურთიერთობას, ეწოდება ატრიბუტები.

თითოეული ატრიბუტი განსაზღვრულია დომენზე, ამიტომ დომენი შეიძლება ჩაითვალოს, როგორც მოცემული ატრიბუტის სწორი მნიშვნელობების ნაკრები. ერთი და იგივე ურთიერთობის მრავალი ატრიბუტი და სხვადასხვა ურთიერთობის ატრიბუტებიც კი შეიძლება განისაზღვროს იმავე დომენზე.

ატრიბუტი, რომლის მნიშვნელობაც ცალსახად განსაზღვრავს ტოპებს, ეწოდება გასაღები (ან უბრალოდ გასაღები). გასაღები არის "პერსონალის ნომერი" ატრიბუტი, რადგან მისი ღირებულება უნიკალურია საწარმოს თითოეული თანამშრომლისთვის. თუ ტოპების იდენტიფიცირება ხდება მხოლოდ რამდენიმე ატრიბუტის მნიშვნელობების შეერთებით, მაშინ ნათქვამია, რომ ურთიერთობას აქვს კომპოზიტური გასაღები.

Მთავარი გასაღები- რელაციური მონაცემთა მოდელში, ურთიერთობის ერთ-ერთი პოტენციური გასაღები, შერჩეული, როგორც პირველადი გასაღები (ან ნაგულისხმევი გასაღები).

ურთიერთობა შეიძლება შეიცავდეს რამდენიმე გასაღებს. ერთ-ერთი გასაღები ყოველთვის გამოცხადებულია პირველადიმისი მნიშვნელობების განახლება შეუძლებელია. ყველა სხვა ურთიერთობის გასაღებს ეწოდება შესაძლო გასაღებები.

თეორიული თვალსაზრისით, ყველა პოტენციური (შესაძლებელი) ურთიერთობის გასაღები ექვივალენტურია, ანუ მათ აქვთ იგივე უნიკალურობა და მინიმალურობის თვისებები. თუმცა, პირველადი გასაღები ჩვეულებრივ შეირჩევა პოტენციური გასაღებებიდან, რომლებიც ყველაზე მოსახერხებელია გარკვეული პრაქტიკული მიზნებისთვის, მაგალითად, შესაქმნელად გარე გასაღებები სხვა კუთხით ან კლასტერული ინდექსის შესაქმნელად. ამიტომ, როგორც წესი, პირველად გასაღებად ირჩევა ის, რომელსაც აქვს ყველაზე მცირე ზომა (ფიზიკური საცავი) და/ან შეიცავს ატრიბუტების უმცირეს რაოდენობას.

თუ მთავარი გასაღებიშედგება ერთი ატრიბუტისაგან, მას ე.წ მარტივი გასაღებით.

თუ მთავარი გასაღებიშედგება ორი ან მეტი ატრიბუტისაგან, ე.წ რთული გასაღები. ასე რომ, სახელი, გვარი, პატრონიმი, პასპორტის ნომერი, პასპორტის სერია ინდივიდუალურად არ შეიძლება იყოს პირველადი გასაღები, რადგან ისინი შეიძლება იყოს იგივე ორი ან მეტი ადამიანისთვის. მაგრამ არ არსებობს ერთი და იგივე ტიპის ორი პერსონალური დოკუმენტი იგივე სერიით და ნომრით. მაშასადამე, ადამიანების შესახებ მონაცემებს შემცველ ურთიერთობაში, პირველადი გასაღები შეიძლება იყოს ატრიბუტების ქვეჯგუფი, რომელიც შედგება პერსონალური დოკუმენტის ტიპის, მისი სერიებისა და ნომრისგან.



იერარქიული და ქსელური მონაცემთა მოდელებისგან განსხვავებით, რელაციურს არ გააჩნია ჯგუფური ურთიერთობის კონცეფცია. სხვადასხვა ურთიერთობის ტოპებს შორის ასოციაციების ასახვისთვის გამოიყენება მათი გასაღებების დუბლირება.

ატრიბუტები, რომლებიც სხვა ურთიერთობების გასაღებების ასლებია, ეწოდება უცხო გასაღებები.

მაგალითად, ურთიერთობა DEPARTMENT და EMPLOYEE ურთიერთობებს შორის იქმნება პირველადი გასაღების კოპირებით "განყოფილების_ნომერი" პირველი ურთიერთობიდან მეორემდე. ამრიგად, მოცემული განყოფილების თანამშრომელთა სიის მისაღებად აუცილებელია: 1) DEPARTMENT ცხრილიდან დააყენეთ ატრიბუტის მნიშვნელობა. "განყოფილების_ნომერი" , რომელიც შეესაბამება ამ "Department_Name". 2) აირჩიეთ ყველა ჩანაწერი EMPLOYEE ცხრილიდან, ატრიბუტის მნიშვნელობა "განყოფილების_ნომერი"რაც უდრის წინა საფეხურზე მიღებულს. იმისათვის, რომ გაიგოთ, რომელ განყოფილებაში მუშაობს თანამშრომელი, თქვენ უნდა შეასრულოთ საპირისპირო ოპერაცია: 1) განსაზღვროთ "განყოფილების_ნომერი" EMPLOYEE ცხრილიდან. 2) მიღებული მნიშვნელობის გამოყენებით ვპოულობთ ჩანაწერს DEPARTMENT ცხრილში.


18. ნორმალიზაცია რელაციურ მონაცემთა ბაზებში, ნორმალური ფორმის კონცეფცია მონაცემთა ბაზის დიზაინში.

ნორმალური ფორმა - ურთიერთობის თვისება რელაციური მონაცემთა მოდელში, რომელიც ახასიათებს მას სიჭარბის თვალსაზრისით, რამაც შეიძლება გამოიწვიოს შერჩევის ან მონაცემების შეცვლის ლოგიკურად მცდარი შედეგები. ნორმალური ფორმა განისაზღვრება, როგორც მოთხოვნების ერთობლიობა, რომელიც უნდა აკმაყოფილებდეს ურთიერთობას.

მონაცემთა ბაზის ნორმალურ ფორმაში გადაყვანის პროცესს ეწოდება ნორმალიზაცია . ნორმალიზება მიზნად ისახავს მონაცემთა ბაზის სტრუქტურის იმ ფორმამდე მიყვანას, რომელიც უზრუნველყოფს მინიმალურ ზედმეტობას, ანუ ნორმალიზაცია არ არის გამიზნული სამუშაო პროდუქტიულობის შემცირებაზე ან გაზრდაზე, ან მონაცემთა ბაზის მოცულობის შემცირებაზე ან გაზრდაზე. ნორმალიზაციის საბოლოო მიზანია მონაცემთა ბაზაში შენახული ინფორმაციის პოტენციური შეუსაბამობის შემცირება.



ზედმეტობის აღმოფხვრა ხორციელდება, როგორც წესი, ურთიერთობების დაშლით ისე, რომ თითოეულ ურთიერთობაში ინახება მხოლოდ პირველადი ფაქტები (ანუ ფაქტები, რომლებიც არ არის დასკვნა სხვა შენახული ფაქტებიდან).

ფუნქციური დამოკიდებულებები.

რელაციური მონაცემთა ბაზა შეიცავს როგორც სტრუქტურულ, ასევე სემანტიკურ ინფორმაციას. მონაცემთა ბაზის სტრუქტურა განისაზღვრება მასში შემავალი კავშირების რაოდენობისა და ტიპის მიხედვით და ამ ურთიერთობების ტოპებს შორის არსებული ერთიდან ბევრთან. სემანტიკური ნაწილი აღწერს ფუნქციონალური დამოკიდებულებების ერთობლიობას, რომელიც არსებობს ამ ურთიერთობების ატრიბუტებს შორის. მოდით განვსაზღვროთ ფუნქციური დამოკიდებულება.

19. 1NF: ძირითადი განმარტებები და ტრანსფორმაციის წესები.

პირველი ნორმალური ფორმის განსახილველად საჭიროა ორი განმარტება:

მარტივი ატრიბუტი - ატრიბუტი, რომლის მნიშვნელობები არის ატომური (განუყოფელი).

რთული ატრიბუტი - მიიღება რამდენიმე ატომური ატრიბუტის შეერთებით, რომლებიც შეიძლება განისაზღვროს იმავე ან სხვადასხვა დომენზე (მას ასევე უწოდებენ ვექტორს ან მონაცემთა აგრეგატს).

პირველი ნორმალური ფორმის განმარტება:

კავშირი არის 1NF-ში, თუ მისი ყველა ატრიბუტის მნიშვნელობები ატომურია. . წინააღმდეგ შემთხვევაში, ეს საერთოდ არ არის ცხრილი და ასეთი ატრიბუტები უნდა დაიშალა.

მოდით შევხედოთ მაგალითს:

საწარმოს ადამიანური რესურსების დეპარტამენტის მონაცემთა ბაზაში აუცილებელია თანამშრომლების შესახებ ინფორმაციის შენახვა, რომლის წარდგენა შესაძლებელია

თანამშრომელი (EMPLOYEE_NUMBER, სახელი, დაბადების თარიღი, WORK_HISTORY, CHILDREN).

ამ ურთიერთობის ფრთხილად განხილვიდან გამომდინარეობს, რომ ატრიბუტები "სამუშაო_ისტორია"და "ბავშვები"კომპლექსურია, უფრო მეტიც, ატრიბუტი "სამუშაო_ისტორია"მოიცავს კიდევ ერთ რთულ ატრიბუტს "ხელფასი_ისტორია".
ეს ერთეულები ასე გამოიყურება:

 JOB_HISTORY (RECEPTION_DATE, NAME, SALARY_HISTORY),

 SALARY_HISTORY (APPOINTMENT_DATE, SALARY),

 CHILDREN (CHILD_NAME, BIRTH_YEAR).

მათი კავშირი ნაჩვენებია ნახ. 3.3.

სურ.3.3. თავდაპირველი დამოკიდებულება.

იმისთვის, რომ თავდაპირველი კავშირი SERVANT პირველ ნორმალურ ფორმამდე მივიყვანოთ, აუცილებელია მისი დაშლა ოთხ მიმართებად, როგორც ეს ნაჩვენებია შემდეგ სურათზე:

სურ.3.4. ურთიერთობების ნორმალიზება.

აქ თითოეული ურთიერთობის პირველადი გასაღები ხაზგასმულია ლურჯი ჩარჩოთი, უცხო კლავიშების სახელები ლურჯი შრიფტით. შეგახსენებთ, რომ უცხოური გასაღებები გამოიყენება ფუნქციონალური დამოკიდებულებების წარმოსაჩენად, რომლებიც არსებობს წყაროს მიმართებაში. ეს ფუნქციური დამოკიდებულებები მითითებულია ისრებით ხაზებით.

ნორმალიზაციის ალგორითმი აღწერილია E.F. Codd-ის მიერ შემდეგნაირად:

  • დაწყებული ხის ზედა მიმართულებიდან (სურათი 3.3.), აღებულია მისი პირველადი გასაღები და ყოველი უშუალოდ დაქვემდებარებული მიმართება ფართოვდება ამ პირველადი გასაღების დომენის ან დომენების კომბინაციის ჩასმით.
  • ამ გზით გაფართოვებული თითოეული ურთიერთობის ძირითადი გასაღები შედგება ძირითადი გასაღებისგან, რომელიც ურთიერთობას ჰქონდა გაფართოებამდე და დამატებული მშობელი ურთიერთობის ძირითადი გასაღებისგან.
  • ამის შემდეგ, ყველა არამარტივი დომენი წაიშლება მშობლის მიმართებიდან, ამოღებულია ხის ზედა კვანძი და იგივე პროცედურა მეორდება თითოეულ დარჩენილ ქვეხეზე.

20. 2NF: ძირითადი განმარტებებიდა ტრანსფორმაციის წესები.

ძალიან ხშირად, ურთიერთობის პირველადი გასაღები მოიცავს რამდენიმე ატრიბუტს (ამ შემთხვევაში მას ე.წ კომპოზიტური) - იხილეთ, მაგალითად, ურთიერთობა CHILDREN, რომელიც ნაჩვენებია ნახ. 3.4 კითხვა 19. პარალელურად შემოდის ცნება სრული ფუნქციონალური დამოკიდებულება.

განმარტება:

არა გასაღების ატრიბუტი ფუნქციურად სრულად არის დამოკიდებული კომპოზიციურ გასაღებზე, თუ ის ფუნქციურად არის დამოკიდებული მთელ კლავიშზე, როგორც მთლიანზე, მაგრამ ფუნქციურად არ არის დამოკიდებული მის რომელიმე შემადგენელ ატრიბუტზე.

მაგალითი:

იყოს კავშირი SUPPLY (N_SUPPLIER, PRODUCT, PRICE).
მომწოდებელმა შეიძლება მიაწოდოს სხვადასხვა პროდუქცია და ერთი და იგივე პროდუქტი შეიძლება იყოს სხვადასხვა მომწოდებლის მიერ. მაშინ ურთიერთობის გასაღები არის "N_მომწოდებელი + პროდუქტი". დაე, ყველა მომწოდებელმა მიაწოდოს საქონელი იმავე ფასად. შემდეგ ჩვენ გვაქვს შემდეგი ფუნქციონალური დამოკიდებულებები:

  • N_მიმწოდებელი, პროდუქტი -> ფასი
  • პროდუქტი -> ფასი

ფასის ატრიბუტის არასრული ფუნქციონალური დამოკიდებულება გასაღებზე იწვევს შემდეგ ანომალიას: როდესაც საქონლის ფასი იცვლება, საჭიროა ურთიერთობის სრული ხედვა, რათა შეიცვალოს ყველა ჩანაწერი მისი მომწოდებლების შესახებ. ეს ანომალია არის შედეგი იმისა, რომ ორი სემანტიკური ფაქტი გაერთიანებულია მონაცემთა ერთ სტრუქტურაში. შემდეგი გაფართოება იძლევა ურთიერთობებს 2NF-ში:

  • მიწოდება (N_SUPPLIER, PRODUCT)
  • PRODUCT_PRICE (PRODUCT, PRICE)

ასე რომ თქვენ შეგიძლიათ მისცეს

მეორე ნორმალური ფორმის განმარტება: კავშირი არის 2NF-ში, თუ ის არის 1NF-ში და ყოველი არა გასაღების ატრიბუტი სრულად ფუნქციურად არის დამოკიდებული გასაღებზე.

21. 3NF: ძირითადი განმარტებებიდა ტრანსფორმაციის წესები.

მესამე ნორმალური ფორმის განხილვამდე აუცილებელია კონცეფციის გაცნობა: გარდამავალი ფუნქციური დამოკიდებულება.

განმარტება:

მოდით X, Y, Z იყოს რაღაც ურთიერთობის სამი ატრიბუტი. ამ შემთხვევაში X --> Y და Y --> Z, მაგრამ არ არსებობს საპირისპირო შესაბამისობა, ე.ი. Z -/-> Y და Y -/-> X. მაშინ Z ტრანზიტიულად არის დამოკიდებული X-ზე.
იყოს კავშირი STORAGE ( ფირმა, WAREHOUSE, VOLUME), რომელიც შეიცავს ინფორმაციას საწყობებიდან საქონლის მიმღები კომპანიებისა და ამ საწყობების მოცულობის შესახებ. ძირითადი ატრიბუტი - "მტკიცე". თუ თითოეულ კომპანიას შეუძლია მიიღოს საქონელი მხოლოდ ერთი საწყობიდან, მაშინ ამ მხრივ არსებობს შემდეგი ფუნქციონალური დამოკიდებულებები:

  • ფირმა -> მარაგი
  • მარაგი -> მოცულობა

ამ შემთხვევაში, ანომალიები წარმოიქმნება:

  • თუ ამ მომენტში არცერთი კომპანია არ იღებს საქონელს საწყობიდან, მაშინ მონაცემთა ბაზაში მისი მოცულობის შესახებ მონაცემების შეტანა შეუძლებელია (რადგან ძირითადი ატრიბუტი არ არის განსაზღვრული)
  • თუ საწყობის მოცულობა იცვლება, აუცილებელია მთელი ურთიერთობის ნახვა და ბარათების შეცვლა ამ საწყობთან დაკავშირებული ყველა კომპანიისთვის.

ამ ანომალიების აღმოსაფხვრელად აუცილებელია ორიგინალური ურთიერთობის ორად დაშლა:

  • შენახვა ( ფირმა, აქცია)
  • STORAGE_VOLUME ( საფონდო, ტომი)

მესამე ნორმალური ფორმის განმარტება:

კავშირი არის 3NF-ში, თუ ის არის 2NF-ში და ყოველი არა გასაღების ატრიბუტი ტრანზიტიულად არ არის დამოკიდებული პირველად გასაღებზე.

InterBase-ს შეუძლია გამოიყენოს შემდეგი ტიპის შეზღუდვები:
  • PRIMARY KEY - ცხრილის პირველადი გასაღები.
  • UNIQUE - უნიკალური მაგიდის გასაღები.
  • ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ- უცხოური გასაღები, უზრუნველყოფს ბმულს სხვა ცხრილთან და გარანტიას იძლევა რეფერენციალური მთლიანობის მშობელსა და ბავშვის მაგიდები.

შენიშვნა ტერმინოლოგიაზე

თუ ამ კურსის ავტორს ჰგავხართ იმით, რომ მოგწონთ პასუხების ძებნა კითხვაზე, რომელიც გაინტერესებთ ყოვლისმომცველად, სხვადასხვა ავტორის სხვადასხვა ნაწარმოებებში, მაშინ ვერ შეამჩნევთ გარკვეულ დაბნეულობას განმარტებებში. მთავარი (ოსტატი) -> დაქვემდებარებული (დეტალური)მაგიდები. შეგახსენებთ, რომ მთავარ ცხრილს ხშირად უწოდებენ მშობლის ცხრილს, ხოლო დაქვემდებარებულ ცხრილს ხშირად უწოდებენ ბავშვის ცხრილს.

ეს ალბათ იმის გამოა, თუ როგორ არის განმარტებული ეს განმარტებები ლოკალურ და SQL სერვერის DBMS-ებში.

ადგილობრივ DBMS-ებში მთავარი ცხრილი არის ის, რომელიც შეიცავს ძირითად მონაცემებს, ხოლო დაქვემდებარებული ცხრილი შეიცავს დამატებით მონაცემებს. ავიღოთ, მაგალითად, სამი დაკავშირებული ცხრილი. პირველი შეიცავს მონაცემებს გაყიდვების შესახებ, მეორე - პროდუქტებზე და მესამეში - მომხმარებლებზე:


ბრინჯი.

18.1.

აქ ძირითადი ინფორმაცია ინახება გაყიდვების ცხრილში, შესაბამისად ეს არის მთავარი (მშობელი) ცხრილი. დამატებითი ინფორმაცია ინახება პროდუქტისა და მომხმარებელთა ცხრილებში, რაც ნიშნავს, რომ ისინი ბავშვები არიან. ეს გასაგებია: ერთ ქალიშვილს არ შეიძლება ჰყავდეს ორი ბიოლოგიური დედა, მაგრამ ერთ დედას საკმაოდ შეუძლია ორი ქალიშვილი გააჩინოს. მაგრამ SQL მონაცემთა ბაზის სერვერებში არსებობს ურთიერთობების განსხვავებული განმარტება: როდესაც ცხრილის ერთი ველი ეხება სხვა ცხრილის ველს, მას ე.წ.უცხოური გასაღები . და ველი, რომელსაც ის ეხება, ეწოდება მშობელი ანმთავარი გასაღები . ცხრილს, რომელსაც აქვს უცხო გასაღები (ბმული ჩანაწერზე სხვა ცხრილში) ხშირად უწოდებენ ბავშვს და ცხრილსმშობლის გასაღები - მშობელი. ასევე ურთიერთობების განმარტებაში ამბობენ, რომ მშობელს შეიძლება ჰქონდეს მხოლოდ ერთი უნიკალური ჩანაწერი, რომელიც შეიძლება რამდენიმე ჩანაწერით იყოს მითითებული..

ბავშვის მაგიდა ასე რომ, ზემოთ მოცემულ მაგალითში, გაყიდვების ცხრილს აქვს ორი უცხო გასაღები: პროდუქტის ID და მომხმარებლის ID. და ორივე ცხრილი ფიგურის მარჯვენა მხარეს აქვსმშობლის გასაღები „იდენტიფიკატორი“. ვინაიდან ერთი და იგივე მომხმარებელი ან პროდუქტი შეიძლება განმეორებით გამოჩნდეს გაყიდვების ცხრილში, გამოდის, რომ ფიგურის მარჯვენა მხარეს ორივე მაგიდა მშობლებია, ხოლო მარცხენა მაგიდა არის ბავშვი. იმიტომ რომ ახლა ვსწავლობთ InterBase - SQL მონაცემთა ბაზის სერვერზე, ამ განმარტებებით ვიხელმძღვანელებთ მომდევნო ლექციებში. იმისათვის, რომ ჩვენი ტვინი უფრო მეტად არ გავაფუჭოთ ამ დაბნეულობის გამო, მაშინვე შევთანხმდეთ:ბავშვის მაგიდა

აქვს უცხო გასაღები (FOREIGN KEY) სხვა ცხრილისთვის.

ᲛᲗᲐᲕᲐᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘᲛᲗᲐᲕᲐᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ - პირველადი გასაღები არის ერთ-ერთი ძირითადი ტიპის შეზღუდვა მონაცემთა ბაზაში. პირველადი გასაღები შექმნილია ცხრილში ჩანაწერის ცალსახად იდენტიფიცირებისთვის და უნდა იყოს უნიკალური. ძირითადი გასაღებები PRIMARY KEY განლაგებულია ცხრილებში, რომლებსაც ჩვეულებრივ უწოდებენ მშობელს (მშობელს). პირველადი გასაღები არ უნდა აგვერიოს ადგილობრივი მონაცემთა ბაზების პირველადი ინდექსებით. პირველადი გასაღები არ არის ინდექსი, არამედ შეზღუდვა. პირველადი გასაღების შექმნისას InterBase ავტომატურად ქმნის მისთვისუნიკალური ინდექსი ავტომატურად ქმნის მისთვის. თუმცა თუ შევქმნით , ეს არ შექმნის. ცხრილს შეიძლება ჰქონდეს მხოლოდ ერთი ძირითადი გასაღები, PRIMARY KEY.

ვთქვათ, თქვენ გაქვთ ცხრილი თანამშრომლების სიით. გვარის ველი შეიძლება შეიცავდეს დუბლიკატ მნიშვნელობებს (სახელებს), ამიტომ ის არ შეიძლება გამოყენებულ იქნას როგორც პირველადი გასაღები. იშვიათია, მაგრამ არიან სახელები, რომლებსაც გარდა ამისა, იგივე სახელები აქვთ. უფრო იშვიათად, არსებობს სრული სახელები, ამიტომ სამივე ველიც კი "გვარი" + "სახელი" + "პატრონიმი" ვერ უზრუნველყოფს ჩანაწერის უნიკალურობას და ვერ იქნება პირველადი გასაღები. ამ შემთხვევაში, გამოსავალი, როგორც ადრე, არის იდენტიფიკატორის ველის დამატება, რომელიც შეიცავს ამ პიროვნების სერიულ ნომერს. ასეთი ველები, როგორც წესი, კეთდება ავტომატური გაზრდით (მომავალ ლექციებში ვისაუბრებთ ავტომატური ზრდის ველების ორგანიზებაზე). Ისე,

Მთავარი გასაღები არის ერთი ან მეტი ველი ცხრილში, რომელთა კომბინაცია უნიკალურია თითოეული ჩანაწერისთვის.

თუ პირველადი გასაღები შეიცავს ერთ სვეტს (როგორც ეს ყველაზე ხშირად ხდება), PRIMARY KEY სპეციფიკატორი გამოიყენება, როდესაც სვეტის განმარტება:

CREATE TABLE Prim_1(Stolbec1 INT NOT NULL PRIMARY KEY, Stolbec2 VARCHAR(50))

თუ პირველადი გასაღები აგებულია რამდენიმე სვეტზე, მაშინ სპეციფიკატორი მოთავსებულია ყველა ველის განსაზღვრის შემდეგ:

TABLE-ის შექმნა Prim_2(Stolbec1 INT NOT NULL, Stolbec2 VARCHAR(50) NOT NULL, ძირითადი გასაღები (Stolbec1, Stolbec2))

როგორც მაგალითებიდან ჩანს, პირველადი გასაღები უნდა ჰქონდეს NOT NULL სვეტ(ებ)ის შეზღუდვა.

უნიკალური

უნიკალური- უნიკალური გასაღები. UNIQUE მიუთითებს, რომ ამ ველის ყველა მნიშვნელობა უნდა იყოს უნიკალური, ამიტომ ასეთი ველები ასევე არ შეიძლება შეიცავდეს მნიშვნელობებს NULL. UNIQUE გასაღები შეიძლება ითქვას, რომ არის პირველადი გასაღების ალტერნატივა, მაგრამ არსებობს განსხვავებები. მთავარი განსხვავება ისაა, რომ უნდა იყოს მხოლოდ ერთი ძირითადი გასაღები, მაშინ როცა შეიძლება იყოს რამდენიმე უნიკალური გასაღები. გარდა ამისა, UNIQUE შეზღუდვა არ შეიძლება აგებული იყოს იმავე სვეტების კომპლექტზე, რომელიც გამოიყენებოდა PRIMARY KEY ან სხვა UNIQUE შეზღუდვისთვის. უნიკალური გასაღებები, ისევე როგორც ძირითადი გასაღებები, გვხვდება ცხრილებში, რომლებიც სხვა ცხრილების მშობლებია.

UNIQUE შეზღუდვით გამოცხადებული სვეტი, როგორც პირველადი გასაღები, შეიძლება გამოყენებულ იქნას რეფერენციალური მთლიანობის აღსასრულებლად მის მშობელსა და შორის ბავშვის მაგიდები. ამ შემთხვევაში, საგარეო გასაღები - მშობელი. ასევე ურთიერთობების განმარტებაში ამბობენ, რომ მშობელს შეიძლება ჰქონდეს მხოლოდ ერთი უნიკალური ჩანაწერი, რომელიც შეიძლება რამდენიმე ჩანაწერით იყოს მითითებული.ეხება ამ ველ(ებ)ს. როგორც პირველადი გასაღების შემთხვევაში, როდესაც იქმნება უნიკალური გასაღები, ა ავტომატურად ქმნის მისთვის. მაგრამ არა პირიქით. ცხრილის შექმნის მაგალითი ერთი ძირითადი და ორი უნიკალური გასაღებით:

შექმენით ცხრილი Prim_3(Stolbec1 INT NOT NULL PRIMARY key, Stolbec2 VARCHAR(50) NOT NULL UNIQUE, Stolbec3 FLOAT NOT NULL UNIQUE)

ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ

ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ- გარე გასაღები. ეს არის ძალიან ძლიერი ინსტრუმენტი ცხრილებს შორის რეფერენტული მთლიანობის უზრუნველსაყოფად, რომელიც საშუალებას გაძლევთ არა მხოლოდ აკონტროლოთ სწორი ბმულების არსებობა, არამედ ავტომატურად მართოთ ისინი. უცხოური გასაღებები მოთავსებულია ცხრილებში, რომლებიც არის სხვა ცხრილების ბავშვები (ბავშვი). რეფერენციული მთლიანობაუზრუნველყოფილია ზუსტად უცხოური გასაღებით, რომელიც ეხება პირველად ან

ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘგამოიყენება ბმულის შეზღუდვისთვის.
როდესაც ერთი ცხრილის ველში ყველა მნიშვნელობა წარმოდგენილია სხვა ცხრილის ველში, ამბობენ, რომ პირველი ველი ეხება მეორეს. ეს მიუთითებს პირდაპირ ურთიერთობაზე ორი ველის მნიშვნელობებს შორის.

როდესაც ცხრილში ერთი სქესი ეხება მეორეს, მას უწოდებენ უცხოური გასაღები; და ველი, რომელსაც ის ეხება, ეწოდება . ცხრილს, რომელსაც აქვს უცხო გასაღები (ბმული ჩანაწერზე სხვა ცხრილში) ხშირად უწოდებენ ბავშვს და ცხრილს. უცხო გასაღებისა და მშობლის გასაღების სახელები არ უნდა იყოს იგივე. უცხო კლავიშს შეიძლება ჰქონდეს ნებისმიერი რაოდენობის ველი, რომელიც დამუშავებულია როგორც ერთი ერთეული. უცხო კლავიშს და მშობლის გასაღებს, რომელსაც ის მიუთითებს, უნდა ჰქონდეთ ერთი და იგივე ველის ნომერი და ველის ტიპი და იყოს იგივე თანმიმდევრობით. როდესაც ველი არის უცხო გასაღები, ის გარკვეულწილად დაკავშირებულია იმ ცხრილთან, რომელსაც ის მიუთითებს. უცხო გასაღების თითოეული მნიშვნელობა (თითოეული მწკრივი) ცალსახად უნდა ეხებოდეს მშობელი გასაღების ერთ და მხოლოდ ამ მნიშვნელობას (რიგს). თუ ეს პირობა დაკმაყოფილებულია, მაშინ მონაცემთა ბაზა არის მდგომარეობაში რეფერენციული მთლიანობა.

SQLინარჩუნებს რეფერენციულ მთლიანობას შეზღუდვით ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ. ამ ფუნქციამ უნდა შეზღუდოს მნიშვნელობები, რომლებიც შეიძლება შეიტანოს მონაცემთა ბაზაში, რათა აიძულოს უცხო გასაღები და მშობელი გასაღები შეესაბამებოდეს რეფერენციულ მთლიანობას. შეზღუდვის ერთ-ერთი ქმედება ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘარის მნიშვნელობების ჩაშვება ველებისთვის, რომლებიც შემოიფარგლება როგორც უცხო გასაღები, რომელიც ჯერ არ არის წარმოდგენილი მშობლის გასაღებში. ეს შეზღუდვა ასევე გავლენას ახდენს მშობელი გასაღების მნიშვნელობების შეცვლის ან წაშლის უნარზე

შეზღუდვა ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘგამოიყენება ბრძანებაში CREATE TABLE (ან ALTER TABLE (განზრახულია შეცვალოს ცხრილის სტრუქტურა)), რომელიც შეიცავს ველს, რომელიც გამოცხადებულია უცხო კლავიშად ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ.

შეზღუდვების უმეტესობის მსგავსად, ეს შეიძლება იყოს ცხრილის ან სვეტის შეზღუდვა, ცხრილის სახით, რომელიც საშუალებას გაძლევთ გამოიყენოთ მრავალი ველი, როგორც ერთი უცხო გასაღები.

ცხრილის შეზღუდვის სინტაქსი ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ:

ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ ლიტერატურა

[ ]

პირველი სვეტის სია არის მძიმით გამოყოფილი სია ცხრილის ერთი ან მეტი სვეტისა, რომელიც შეიქმნება ან შეიცვლება ამ ბრძანებით.

Pktable- ეს არის ცხრილი, რომელიც შეიცავს მშობლის გასაღებს. ეს შეიძლება იყოს ცხრილი, რომელიც შექმნილია ან შეცვლილია მიმდინარე ბრძანებით.

მეორე სვეტის სია არის სვეტების სია, რომლებიც შეადგენენ მშობლის გასაღებს. ორი სვეტის სია უნდა იყოს თავსებადი, ე.ი.

  • აქვს იგივე რაოდენობის სვეტები
  • მოცემული თანმიმდევრობით, უცხო გასაღების სვეტების სიის პირველ, მეორე, მესამე და ა.შ. სვეტებს უნდა ჰქონდეთ მონაცემთა იგივე ტიპები და ზომები, როგორც პირველი, მეორე, მესამე და ა.შ., მშობელი გასაღების სვეტების სიის სვეტები.
  • ორივე სვეტის სიებში სვეტებს არ უნდა ჰქონდეს იგივე სახელები.

საგარეო გასაღები მაგალითი 1

მაგიდის შექმნა სტუდენტი
(Kod_stud მთელი რიცხვი NOT NULL PRIMARY ᲒᲐᲡᲐᲦᲔᲑᲘ,
Kod_spec მთელი რიცხვი NOT NULL,

მისამართები char(50),
ბურთი ათობითი),
ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ(Kod_spec) ლიტერატურასპეციფიკაცია (Kod_spec)
);

შეზღუდვის გამოსაყენებლად CREATE TABLE-ის ნაცვლად ALTER TABLE-ის გამოყენებისას ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘუცხო გასაღებისა და მშობლის გასაღებში მითითებული მნიშვნელობები უნდა იყოს რეფერენციული მთლიანობის მდგომარეობაში. წინააღმდეგ შემთხვევაში, ბრძანება უარყოფილი იქნება.

შეზღუდვის გამოყენება ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘცხრილი ან სვეტი, შეგიძლიათ გამოტოვოთ მშობელი გასაღების სვეტების სია, თუ მშობლის გასაღებს აქვს PRIMARY შეზღუდვა ᲒᲐᲡᲐᲦᲔᲑᲘ. ბუნებრივია, მრავალი ველის მქონე კლავიშების შემთხვევაში, უცხო და პირველადი კლავიშების სვეტების თანმიმდევრობა უნდა შეესაბამებოდეს და, ნებისმიერ შემთხვევაში, კვლავ მოქმედებს ორ კლავიშს შორის თავსებადობის პრინციპი.

საგარეო გასაღები მაგალითი 2

მაგიდის შექმნა სტუდენტი (
Kod_stud მთელი რიცხვი NOT NULL PRIMARY ᲒᲐᲡᲐᲦᲔᲑᲘ,
ცნობილი სიმბოლო (30) NOT NULL UNIQUE,
მისამართები char(50),
ბურთი ათობითი),
Kod_spec მთელი რიცხვი REFERENCES Spec
);

რეფერენტული მთლიანობის შესანარჩუნებლად საჭიროა გარკვეული შეზღუდვები იმ მნიშვნელობებზე, რომლებიც შეიძლება იყოს წარმოდგენილი ველებში, რომლებიც გამოცხადებულია როგორც უცხო გასაღები და მშობელი გასაღები. მთავარი გასაღები უნდა იყოს სტრუქტურირებული ისე, რომ თითოეული უცხო გასაღების მნიშვნელობა შეესაბამება ერთ მითითებულ მწკრივს. ეს ნიშნავს, რომ ის (გასაღები) უნდა იყოს უნიკალური და არ შეიცავდეს ცარიელ მნიშვნელობებს (NULL).

ეს არ არის საკმარისი იმისთვის, რომ ძირითადი გასაღები დააკმაყოფილოს იგივე მოთხოვნა, როგორც უცხო გასაღების გამოცხადებისას. SQLდარწმუნებული უნდა იყოს, რომ ორმაგი მნიშვნელობები ან ნულოვანი მნიშვნელობები არ არის შეყვანილი მშობლის გასაღებში. ამიტომ, თქვენ უნდა დარწმუნდეთ, რომ ყველა ველს, რომელიც გამოიყენება როგორც მშობლის გასაღებები, აქვს ან PRIMARY შეზღუდვა ᲒᲐᲡᲐᲦᲔᲑᲘან UNIQUE შეზღუდვა, როგორიცაა NOT NULL შეზღუდვა.

უცხო გასაღების მხოლოდ პირველადი გასაღების მითითება კარგი სტრატეგიაა. როდესაც გამოიყენება უცხოური გასაღებები, ისინი უბრალოდ არ ასოცირდება მშობელ გასაღებებთან, რომლებსაც ისინი მიმართავენ; ისინი ასოცირდება ცხრილის კონკრეტულ მწკრივთან, სადაც მოიძებნება ეს მშობელი გასაღები. თავად მშობელი გასაღები არ იძლევა ინფორმაციას, რომელიც უკვე არ არის უცხოურ გასაღებში.

ვინაიდან პირველადი გასაღების დანიშნულებაა მწკრივის უნიკალურობის იდენტიფიცირება, ეს უფრო ლოგიკური და ნაკლებად ორაზროვანი არჩევანია უცხო გასაღებისთვის. ნებისმიერი უცხო გასაღებისთვის, რომელიც იყენებს უნიკალურ გასაღებს, როგორც მის მთავარ გასაღებს, თქვენ უნდა შექმნათ უცხო გასაღები, რომელიც იყენებს იმავე ცხრილის ძირითად გასაღებს იმავე ეფექტისთვის. უცხო გასაღები, რომელსაც სხვა დანიშნულება არ აქვს, გარდა რიგების დაკავშირებისა, არის პირველადი გასაღების მსგავსი, რომელიც გამოიყენება მხოლოდ რიგების იდენტიფიცირებისთვის და არის კარგი საშუალება მონაცემთა ბაზის სტრუქტურის მკაფიო და მარტივი შესანარჩუნებლად. უცხო გასაღები შეიძლება შეიცავდეს მხოლოდ მნიშვნელობებს, რომლებიც რეალურად არის მშობლის გასაღებში ან ცარიელი (NULL). ამ კლავიშში სხვა მნიშვნელობების შეყვანის ნებისმიერი მცდელობა უარყოფილი იქნება.

უცხოური გასაღები მაგალითი 3

შექმენით მაგიდასთან გადახდა (
sh_payout მთელი რიცხვი,
sh_eml მთელი რიცხვი,
date_გადახდის თარიღი,
sum_payout რეალური,
ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ(sh_eml) ლიტერატურა k_sotr2 (eid)
);

ამ მაგალითში ᲣᲪᲮᲝᲣᲠᲘ ᲒᲐᲡᲐᲦᲔᲑᲘ sh_eml სვეტი ასოცირდება eid სვეტთან k_sotr2 ცხრილიდან.