SQL-i võõrvõtme tutvustus
Võõrvõti on SQL-i piirang. Seda kasutatakse kahe tabeli seostamiseks. Ühes tabelis olev võõrvõti osutab teise tabeli primaarvõtmele. Võõra võtmega saab veenduda, et ühe tabeli real on vastavad read / read teises tabelis. Viidatud tabelit nimetatakse põhitabeliks ja võõra võtmega tabelit nimetatakse alatabeliks. See vanema ja lapse suhe jõustab reegli, mida tuntakse kui soovituslikku terviklikkust. Soovituslik terviklikkus on andmete omadus, mis kinnitab, et kõik nende viited on kehtivad.
Niisiis, kui teil on andmebaasis suhteid ühelt-mitmele või paljudest-paljudele, on võõrvõtmed väga kasulikud. See toimib ristviitena kahe tabeli vahel (lapsevanema tabel ja lapse tabel), kuna see viitab teise tabeli primaarvõtmele. Nii loob see seose vanema_tabeli ja lapselaua vahel.
Süntaks
Uue tabeli loomiseks võõra võtmega on vaja andmebaasis CREATE TABLE luba
CREATE TABLE child_Table
(
column_1 datatype ( NULL |NOT NULL ),
column_2 datatype ( NULL |NOT NULL ),
…
CONSTRAINT F_key
FOREIGN KEY (child_column1, child_column2, … child_column_n)
REFERENCES parent_Table (parent_column1, parent_column2, … parent_column_n)
( ON DELETE ( NO ACTION |CASCADE |SET NULL |SET DEFAULT ) ) ( ON UPDATE ( NO ACTION |CASCADE |SET NULL |SET DEFAULT ) ) );
- Lapse nimi on tabeli nimi, mille me loome
- kolonn_1, veerg_2 - tabelisse lisatavad veerud.
- F_klahv - see on võõra võtme piirang.
- laps_veerg1, lapse_veerg2… laps_veerg_n - see on lapse_Tabelveergude nimi, mis viitavad vanemtabeli peamisele võtmele.
- Parent_Table - see on vanema_tabeli nimi. Vanematabeli peamisele võtmele viidatakse lapsetabelis
- ON DELETE - see parameeter võtab pärast lapsevanemate andmete kustutamist kasutusele lapseandmetega seotud toimingud. SET NULL, NO ACTION, CASCADE, SET DEFAULT on selle parameetri mõned väärtused.
- ON UPDATE - see on valikuline parameeter, mis võtab lapseandmetega pärast vanemandmete värskendamist meetmeid. SET NULL, NO ACTION, CASCADE, SET DEFAULT on selle parameetri mõned väärtused.
- CASCADE - saame seda kasutada koos ON DELETE ja ON UPDATE. Pärast vanemate andmete kustutamist või värskendamist lapse andmed kas kustutatakse või värskendatakse.
Olemasolevasse tabelisse võõra võtme loomiseks on vaja ALTER-i luba tabelil kasutada.
ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
Reeglid
- Võõrad võtmed ei kehti ajutiste tabelite jaoks.
- Võõra võtme piirang ei pea olema lingitud ainult mõne teise tabeli primaarvõtmega, seda saab siduda ka mõne teise tabeli ainulaadse piiranguga.
- VÄLISVÕTME piirangud võivad viidata sama tabeli teisele veerule. Seda nimetatakse eneseviiteks.
- Võõra võtme piirangud võivad viidata sama andmebaasi tabelitele.
- Lapsetabelisse saame sisestada ka NULL-väärtusi.
- Kui lisame võõrvõtme kitsendusse muu kui NULL-i väärtuse, peab väärtus eksisteerima viidatud veeru teistes rikkumisteadetes.
- Vanema unikaalsete võtmete väärtust ei saa muuta, kui värskenduseeskiri on RESTRICT ja seal on üks või mitu sõltuvat rida. Kui värskendamisreegel on MITTE TEGEMINE, saab vanemlikke unikaalseid võtmeid värskendada seni, kuni värskenduse valmimise ajaks on igal lapsel vanemvõti.
Näited
Oletame, et meil on kaks tabelit - Kliendid ja Tellimused. Klientide tabelis on kõik kliendiga seotud andmed ja tellimuste tabelis on klientide tellimustega seotud andmed.
Kliendid
Cust_id | Esmane võti |
Kliendi_nimi | |
Asukoht |
Tellimused
Tellimuse ID | Esmane võti |
Tellimiskuupäev | |
Kogus | |
Cust_id | Võõrvõti |
Kogu summa |
Ülaltoodud näites on tabeli ORDERS veerg Cust_id võõras võti, mis osutab tabeli KLIENDID veerule Cust_id.
Oletame, et neil tabelitel on järgmised väärtused
Kliendid
1001 | Alex | USA |
1002 | Carey | USA |
1003 | Sid | Suurbritannia |
1004 | Tom | AUS |
1005 | Kapil | IND |
Tellimused
78 | 20-10-2018 | 5 | 1002 | 1200 |
79 | 12-10-2017 | 4 | 1001 | 800 |
80 | 20-11-2016 | 2 | 1005 | 369 |
81 | 09-10-2016 | 5 | 1002 | 258 |
82 | 19-08-2016 | 11 | 1004 | 1900 |
83 | 30-06-2016 | 45 | 1001 | 2300 |
84 | 16-02-2016 | 7 | 1001 | 890 |
85 | 02-01-2016 | 2 | 1002 | 260 |
Tellimuse tabelis on cust_id 1001 jaoks kolm tellimust.
Kliendi jaoks cust_id 1003 tellimust ei ole.
Nii et kui meil on vanemate tabelis konkreetseid andmeid (öelge id 1003), siis ei ole vaja neid andmeid lapsetabelisse lisada, vaid vastupidi, see pole tõsi.
Tabelis Laps (tellimuste tabel) ei saa olla andmeid, mida vanemtabelis (Kliendid) pole.
Näiteks ei saa me sisestada tabelisse tellimusi uut rekordit cust_id 1006, kuna cust_id 1006 pole tabelis Kliendid.
Allpool on toodud näited, mis rikuvad selle suhte referentslikku terviklikkust:
- Rea sisestamine tabelisse ORDERS, kus Cust_ID ei kuvata tabeli KLIENDID veerus Cust_ID.
- Rea kustutamine tabelist KLIENDID, kus kustutatava rea Cust_ID on endiselt tabeli ORDERS veerus Cust_ID.
Kui konkreetne kirje põhitabelist kustutatakse, on alamtabeli andmete terviklikkuse säilitamiseks kaks võimalust. Kui kaks tabelit on ühendatud võõrvõtmega ja mõned põhitabeli andmed kustutatakse, mille kohta kirje on olemas ka alamtabelis, on meil olemas mehhanism alamtabeli andmete terviklikkuse salvestamiseks
- Kaskaadi kustutamise korral : see kirje kustutatakse alatabelist, kui võõrvõtme väärtus kustutatakse põhitabelist.
- Sisselülitamisel Kustuta NULL: see seab kõik lapsetabeli kirje väärtused väärtuseks NULL, mille jaoks võõra võtme väärtus kustutatakse põhitabelist.
Järeldus - võõrvõti SQL-is
Seega on soovitatav kasutada andmebaasis Foreign Key võõrvõtit, millel on üks kuni üks või üks kuni palju suhteid. Võõraste võtmepiirangute kasutamise peamine eelis on see, et see parandab jõudlust. Arendajad saavad andmebaasi struktuuri hõlpsalt tuvastada. Samuti saame uurida, kuidas päring andmeid hangib.
Soovitatavad artiklid
See on SQL-i võõrvõtme juhend. Siin arutame süntaksiga SQL-i võõrvõtme reegleid ja näiteid. Võite lisateabe saamiseks vaadata ka järgmisi artikleid -
- SQL vaated
- Liitumiste tüübid SQL Serveris
- Mis on PL / SQL?
- SQL Serveri piirangud
- MySQL-i 6 parimat liitumistüüpi koos näidetega