Jūsų duomenys yra geri tik tuo atveju, jei galite jais pasitikėti. Naudokite duomenų bazės apribojimus, kad įsitikintumėte, jog ji yra tiksli, patikima ir nepažeidžia duomenų modelio.

Key Takeaways

  • Naudokite SQL apribojimus, kad išlaikytumėte duomenų vientisumą ir užtikrintumėte vienodumą savo duomenų bazėje. NOT NULL apribojimas verčia stulpelius atmesti NULL reikšmes.
  • Įdiekite pirminio rakto apribojimus, kad užtikrintumėte stulpelio ar stulpelių rinkinio verčių unikalumą. Taip išvengiama pasikartojančių įrašų duomenų bazės lentelėje.
  • Užsienio rakto apribojimai nustato ryšius tarp lentelių ir užkerta kelią veiksmams, kurie sunaikintų ryšius tarp lentelių. Jie užtikrina, kad įrašas antrinėje lentelėje būtų nuoroda į pirminę lentelę.

Duomenų bazė yra būtina daugeliui programų, tačiau ji gali būti netvarkinga, jei neturite duomenų saugojimo ir apdorojimo gairių.

SQL apribojimai nurodo duomenų saugojimo lentelėje taisykles. Kai nustatote apribojimus, duomenų bazė išmes klaidą, jei bandysite saugoti duomenis, kurie pažeidžia šias taisykles. Apribojimai padeda išlaikyti duomenų vientisumą ir užtikrinti vienodumą jūsų duomenų bazėje.

instagram viewer

Yra keletas SQL apribojimų tipų, kuriuos galite naudoti; čia yra keletas naudingiausių.

1. NOT NULL Apribojimas

Pagal numatytuosius nustatymus duomenų bazės stulpeliai priima duomenis su NULL reikšmėmis. NULL iš esmės reiškia, kad reikšmės nėra. NOT NULL apribojimas priverčia stulpelį atmesti NULL reikšmes.

Šis apribojimas užtikrina, kad kiekviename stulpelyje turi būti reikšmė. Negalite įtraukti įrašo į duomenų bazę nepateikę jokių stulpelių duomenų su NOT NULL apribojimu.

Paimkite pavyzdį a Klientai stalo. Yra tam tikros būtinos informacijos apie kiekvieną klientą, kurią norite įrašyti, pvz., jo vardą ir pavardę. Pridėkite NOT NULL apribojimą prie privalomų laukų, kad užtikrintumėte, jog klientai pateiktų šią informaciją.

Štai pavyzdys, rodantis, kaip galite naudoti NOT NULL apribojimą a PostgreSQL duomenų bazė:

CREATETABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Mobile_No int NOT NULL,
Age int
);

Jei bandysite įterpti kliento įrašą be Amžius lauke, duomenų bazė jį priims be klaidų:

INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 0723000000);

Tačiau jei bandysite įterpti įrašą be Pirmas vardas lauke, duomenų bazė jį atmes pateikdama klaidos pranešimą:

ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null).

2. PAGRINDINIS RAKTO apribojimas

RAKTAS yra unikalus atributas, nustatytas stulpelyje arba lauke, kuris identifikuoja lentelės eilutę (arba įrašą) duomenų bazių sistemose. PRIMARY KEY apribojimas užtikrina stulpelio ar stulpelių rinkinio verčių unikalumą. Jis veikia kaip unikalus identifikatorius iš eilės ir neleidžia duomenų bazės lentelėje pasikartoti įrašams.

Pirminiuose raktuose yra unikalių reikšmių ir negali būti NULL reikšmių. Kiekvienas SQL duomenų bazės lentelė turi turėti tik vieną pirminį raktą. PIRMINIS RAKTAS gali turėti vieną arba kelis stulpelius.

Pavyzdžiui, kuriate klientų įrašų duomenų bazę. Kiekvienas klientas turi įvesti savo ID numerius skirtingai nei visų kitų. Galite taikyti pirminio rakto apribojimą, kad įsitikintumėte, jog nė vienas jūsų klientas neturi to paties ID numerio.

Šis kodas parodo, kaip galite įvesti pirminio rakto apribojimą MySQL duomenų bazėje:

CREATETABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);

Duomenų bazė nepriims šios reikšmės, jei vartotojas įves kitą įrašą su panašiu ID. Vietoj to jis išmes klaidą, rodančią dubliavimą. Šiame pavyzdyje vartotojas bando įterpti du įrašus su tuo pačiu ID:

INSERTINTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );

INSERTINTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 );

Duomenų bazėje bus rodomas klaidos pranešimas:

Duplicate entry '1' for key 'PRIMARY'

Bet jei pakeisite antrojo kliento ID, duomenų bazė priima įrašą. Todėl pirminis raktas užtikrina, kad jūsų klientų įrašuose nebūtų pasikartojančių ID.

3. UŽSIENIO RAKTŲ apribojimas

Užsienio raktai nustatyti ryšį tarp dviejų lentelių. Galite įtraukti pašalinį raktą į lauką / stulpelį vienoje lentelėje, kuris nurodo pirminį raktą kitoje lentelėje.

Lentelė su pirminiu raktu yra pagrindinė lentelė, o lentelė su išoriniu raktu yra antrinė lentelė. Tada įrašas negali egzistuoti antrinėje lentelėje be nuorodos į pirminę lentelę.

Išorinio rakto apribojimas užkerta kelią veiksmams, kurie sunaikintų ryšius tarp lentelių. Pavyzdžiui, jūs negalite NULEISTI vieną lentelę, jei ji susieja su kita naudojant išorinį raktą. Turėsite mesti abu stalus iš karto.

Skirtingai nuo pirminio rakto, galite pasikartoti išorinį raktą ir turėti daugiau nei vieną vienoje lentelėje. Užsienio rakto reikšmės taip pat gali būti NULL. Toliau pateiktame pavyzdyje turite naudoti Kliento ID sukurti užsakymą.

CREATETABLE Customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);

CREATETABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);

INSERTINTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');

INSERTINTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07');

Jei bandysite sukurti užsakymą be esamo Kliento ID, duomenų bazėje rodomas klaidos pranešimas:

Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`))

4. UNIKALUS apribojimas

Šis apribojimas užtikrina, kad dviejose eilutėse negali būti vienodų konkretaus stulpelio verčių. Kaip ir pirminiai raktai, unikalus apribojimas palaiko duomenų vientisumą ir apsaugo nuo pasikartojančių įrašų. Jei dirbate su prastai sukurta duomenų baze be UNIKALUS apribojimo, jums gali tekti to padaryti rasti ir ištrinti dublikatus.

Skirtingai nuo pirminių raktų, vienoje lentelėje galite turėti daug UNIKALŲ apribojimų. Pavyzdžiui, kuriant a Klientai lentelę, galbūt norėsite turėti unikalius ID ir telefono numerius. Norėdami pridėti tokį apribojimą naudodami MySQL serverį, naudokite šią sintaksę:

CREATETABLE Customers (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);

Jei į duomenų bazę įterpsite įrašus su tuo pačiu mobiliojo telefono numeriu, bus rodomas klaidos pranešimas.

INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );

INSERTINTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 );

Klaidos pranešimas bus maždaug toks:

Duplicate entry '254000000' for key 'Mobile_No'

Šis UNIKALUS apribojimas užtikrina, kad duomenų bazėje nebus klientų su tais pačiais ID ar mobiliojo telefono numeriais.

5. PATIKRINTI apribojimą

CECK apribojimas riboja stulpelyje įdėtą verčių diapazoną. Stulpelyje pridėjus CECK apribojimą, bus leidžiamos tik nurodytos to stulpelio reikšmės. Jis užtikrina duomenų vientisumą užtikrindamas, kad vartotojas į lentelę įterpia tik galiojančius duomenis.

Apribojimas CHECK turi įvertinti kiekvieno nurodyto eilutės arba lentelės įrašo reikšmę kaip TRUE arba UnNKNOWN. Jei reikšmė yra FALSE, duomenų bazėje rodomas klaidos pranešimas.

Pavyzdžiui, lentelėje Klientai galbūt norėsite aptarnauti tik vyresnius nei 18 metų klientus. Galite pridėti CHECK apribojimą, kad užtikrintumėte, jog neaptarnaujate nepilnamečių klientų. Apribojimą galite įtraukti į PostgreSQL duomenų bazę, kaip parodyta šiame kode:

CREATETABLE Customers (
ID int NOT NULL,
Age int CHECK(Age>=18),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);

Dabar, jei bandote įvesti kliento amžių, jaunesnį nei 18 metų:

INSERTINTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 );

Duomenų bazėje bus rodomas toks klaidos pranešimas:

ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000)

Kaip pridėti ir pašalinti SQL apribojimus iš duomenų bazių

SQL apribojimai nėra išmesti į akmenį. Galite pridėti arba pašalinti esamų lentelių apribojimus naudodami teiginį ALTER TABLE. ALTER teiginys leidžia dirbti su apribojimais, kad atitiktų jūsų duomenų poreikius.

Yra daug daugiau SQL apribojimų, kuriuos galite išmokti kurti duomenų bazę pagal savo skonį. Galite pradėti nuo šiame straipsnyje išvardytų.