Jedinečný popis SQL. SQL UNIQUE obmedzenie

Jedinečné obmedzenie zabraňuje vytvoreniu dvoch záznamov, ktoré majú rovnakú hodnotu v stĺpci. V tabuľke ZÁKAZNÍCI môžete napríklad chcieť vytvoriť dvoch alebo viacerých ľudí rovnakého veku.

Príklad

Napríklad nasledujúci SQL dotaz vytvorí novú tabuľku s názvom CUSTOMERS a pridá päť stĺpcov. Tu je stĺpec AGE nastavený na UNIQUE, takže nemôžete mať dva záznamy s rovnakým vekom.

VYTVORIŤ TABUĽKU ZÁKAZNÍCI(ID INT NIE JE NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL UNIQUE, ADRESA CHAR (25) , MLA DECIMAL (18, 2), PRIMÁRNY KĽÚČ (ID));

Ak je tabuľka CUSTOMERS už vytvorená, potom ak chcete pridať obmedzenie UNIQUE do stĺpca AGE, musíte napísať príkaz ako dotaz, ktorý je špecifikovaný v bloku kódu nižšie.

ZÁKAZNÍCI ALTER TABLE MODIFY AGE INT NOT NULL UNIQUE;

Môžete tiež použiť nasledujúcu syntax, ktorá podporuje obmedzenia pomenovania vo viacerých stĺpcoch.

ZMENIŤ TABUĽKU ZÁKAZNÍCI PRIDAŤ OBMEDZENIE myUniqueConstraint JEDINEČNÉ(VEK, PLAT);

Odstránenie obmedzenia UNIQUE

Ak chcete odstrániť obmedzenie UNIQUE, použite nasledujúci dotaz SQL.

Posledná aktualizácia: 07/09/2017

Pri vytváraní stĺpcov v T-SQL môžeme použiť množstvo atribútov, z ktorých niektoré sú obmedzenia. Pozrime sa na tieto atribúty.

PRIMÁRNY KĽÚČ

Pomocou výrazu PRIMARY KEY môžete urobiť zo stĺpca primárny kľúč.

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMARY KEY, Vek INT, Meno NVARCHAR(20), Priezvisko NVARCHAR(20), E-mail VARCHAR(30), Telefón VARCHAR(20))

Primárny kľúč jednoznačne identifikuje riadok v tabuľke. Stĺpce typu int nemusia byť primárnym kľúčom, môžu byť akéhokoľvek iného typu.

Nastavenie primárneho kľúča na úrovni tabuľky:

VYTVORIŤ TABUĽKU Zákazníci (ID INT, Vek INT, Meno NVARCHAR(20), Priezvisko NVARCHAR(20), E-mail VARCHAR(30), Telefón VARCHAR(20), PRIMÁRNY KĽÚČ (Id))

Primárny kľúč môže byť zložený kľúč. Takýto kľúč môže byť potrebný, ak máme naraz dva stĺpce, ktoré musia jednoznačne identifikovať riadok v tabuľke. Napríklad:

VYTVORIŤ TABUĽKU OrderLines (OrderId INT, ProductId INT, Množstvo INT, Price MONEY, PRIMÁRNY KĽÚČ (OrderId, ProductId))

Tu polia OrderId a ProductId spolu fungujú ako zložený primárny kľúč. To znamená, že v tabuľke OrderLines nemôžu byť dva riadky, v ktorých majú obe tieto polia súčasne rovnaké hodnoty.

IDENTITA

Atribút IDENTITY vám umožňuje vytvoriť zo stĺpca identifikátor. Tento atribút možno priradiť stĺpcom číselných typov INT, SMALLINT, BIGINT, TYNIINT, DECIMAL a NUMERIC. Pri pridávaní nových údajov do tabuľky SQL Server zvýši hodnotu tohto stĺpca v poslednom zázname o jednu. Identifikátorom je spravidla ten istý stĺpec, ktorý je primárnym kľúčom, aj keď to v zásade nie je potrebné.

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMARY KEY IDENTITY, Vek INT, Meno NVARCHAR(20), Priezvisko NVARCHAR(20), E-mail VARCHAR(30), Telefón VARCHAR(20))

Môžete tiež použiť úplný tvar atribútu:

IDENTITY(prvok; prírastok)

Tu parameter seed označuje počiatočnú hodnotu, od ktorej sa začne odpočítavanie. A parameter prírastku určuje, o koľko sa zvýši ďalšia hodnota. V predvolenom nastavení atribút používa nasledujúce hodnoty:

IDENTITY(1; 1)

To znamená, že odpočítavanie začína od 1. A následné hodnoty sa zvyšujú o jednu. Toto správanie však môžeme potlačiť. Napríklad:

Id INT IDENTITY (2, 3)

V tomto prípade sa odpočítavanie začne od 2 a hodnota každej nasledujúcej položky sa zvýši o 3. To znamená, že prvý riadok bude mať hodnotu 2, druhý - 5, tretí - 8 atď.

Upozorňujeme tiež, že tento atribút by mal mať iba jeden stĺpec v tabuľke.

UNIKÁTNY

Ak chceme, aby mal stĺpec iba jedinečné hodnoty, môžeme preň definovať atribút UNIQUE.

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMARY KEY IDENTITY, Vek INT, Meno NVARCHAR(20), Priezvisko NVARCHAR(20), E-mail VARCHAR(30) UNIQUE, Telefón VARCHAR(20) UNIQUE)

V tomto prípade stĺpce, ktoré predstavujú emailová adresa a telefón budú mať jedinečné hodnoty. A do tabuľky nebudeme môcť pridať dva riadky, ktorých hodnoty pre tieto stĺpce budú rovnaké.

Tento atribút môžeme definovať aj na úrovni tabuľky:

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMÁRNY KĽÚČ, Vek INT, Meno NVARCHAR(20), Priezvisko NVARCHAR(20), E-mail VARCHAR(30), Telefón VARCHAR(20), UNIKÁTNE (E-mail, Telefón))

NULL a NOT NULL

Ak chcete určiť, či stĺpec môže mať hodnotu NULL, môžete mu pri definovaní stĺpca priradiť atribút NULL alebo NOT NULL. Pokiaľ tento atribút nie je explicitne použitý, stĺpec bude mať predvolenú hodnotu NULL. Výnimkou je prípad, keď stĺpec funguje ako primárny kľúč, v tomto prípade nie je predvolená hodnota stĺpca NULL.

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMÁRNY KĽÚČ, Vek INT, Meno NVARCHAR(20) NIE JE NULL, Priezvisko NVARCHAR(20) NIE JE NULL, E-mail VARCHAR(30) JEDINEČNÉ, Telefón VARCHAR(20) JEDINEČNÉ)

DEFAULT

Atribút DEFAULT určuje predvolenú hodnotu pre stĺpec. Ak pri pridávaní údajov nie je pre stĺpec zadaná žiadna hodnota, použije sa preň predvolená hodnota.

VYTVORIŤ TABUĽKU Zákazníci (ID INT IDENTITA PRIMÁRNEHO KĽÚČA, Vek INT VÝCHOZÍ 18, Meno NVARCHAR(20) NIE JE NULL, Priezvisko NVARCHAR(20) NIE JE NULL, E-mail VARCHAR(30) JEDINEČNÉ, Telefón VARCHAR(20) JEDINEČNÉ);

Tu má stĺpec Vek predvolenú hodnotu 18.

KONTROLA

Kľúčové slovo CHECK nastavuje limit na rozsah hodnôt, ktoré je možné uložiť do stĺpca. Na to je za slovom CHECK v zátvorke uvedená podmienka, ktorú musí stĺpec alebo viacero stĺpcov spĺňať. Napríklad vek klientov nemôže byť nižší ako 0 alebo vyšší ako 100:

VYTVORIŤ TABUĽKU Zákazníci (Id INT PRIMÁRNY KĽÚČ IDENTITA, Vek INT PREDVOLENÝ 18 KONTROLA (Vek >0 A Vek< 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE CHECK(Email !=""), Phone VARCHAR(20) UNIQUE CHECK(Phone !=""));

Tiež určuje, že stĺpce Email a Telefón nemôžu mať ako hodnotu prázdny reťazec ( prázdny riadok nie je ekvivalentné s NULL).

Kľúčové slovo AND sa používa na spojenie podmienok. Podmienky môžu byť špecifikované vo forme porovnávacích operácií väčších ako (>), menších ako (<), не равно (!=).

Môžete tiež použiť CHECK na vytvorenie obmedzenia pre tabuľku ako celok:

VYTVORIŤ TABUĽKU Zákazníci (ID INT IDENTITA PRIMÁRNEHO KĽÚČA, Vek INT DEFAULT 18, Meno NVARCHAR(20) NIE JE NULL, Priezvisko NVARCHAR(20) NIE JE NULL, E-mail VARCHAR(30) JEDINEČNÉ, Telefón VARCHAR(20) JEDINEČNÉ, KONTROLA((Vek > 0 A Vek<100) AND (Email !="") AND (Phone !="")))

Operátor OBMEDZENIA. Nastavte názov obmedzení.

Používaním kľúčové slovo CONSTRAINT vám umožňuje zadať názov pre obmedzenia. Ako obmedzenia možno použiť PRIMÁRNY KĽÚČ, UNIQUE, DEFAULT, CHECK.

Názvy obmedzení možno zadať na úrovni stĺpcov. Sú špecifikované za CONSTRAINT pred atribútmi:

VYTVORIŤ TABUĽKU Zákazníci (Id INT CONSTRAINT PK_Customer_Id PRIMARY KEY IDENTITY, Vek INT CONSTRAINT DF_Customer_Age DEFAULT 18 CONSTRAINT CK_Customer_Age CHECK(Vek >0 A Vek< 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) CONSTRAINT UQ_Customer_Email UNIQUE, Phone VARCHAR(20) CONSTRAINT UQ_Customer_Phone UNIQUE)

Obmedzenia môžu mať ľubovoľné názvy, ale spravidla sa používajú tieto predpony:

    "PK_" - pre PRIMÁRNY KĽÚČ

    "FK_" - pre cudzí kľúč

    "CK_" - pre CHECK

    "UQ_" - pre UNIKÁT

    "DF_" - pre DEFAULT

V zásade nie je potrebné špecifikovať názvy obmedzení, keď nastavíte príslušné atribúty, SQL Server automaticky určí ich názvy. Ale ak poznáme názov obmedzenia, môžeme k nemu pristupovať, napríklad ho odstrániť.

A môžete tiež nastaviť všetky názvy obmedzení prostredníctvom atribútov tabuľky:

CREATE TABLE Zákazníci (Id INT IDENTITY, Vek INT CONSTRAINT DF_Customer_Age DEFAULT 18, Meno NVARCHAR(20) NIE JE NULL, Priezvisko NVARCHAR(20) NIE JE NULL, E-mail VARCHAR(30), Telefón VARCHAR(20), (CONSTRAINTRY) PRIMAPK_Customer CONSTRAINTRY , CONSTRAINT CK_Customer_Age CHECK(Vek >0 A Vek< 100), CONSTRAINT UQ_Customer_Email UNIQUE (Email), CONSTRAINT UQ_Customer_Phone UNIQUE (Phone))

V KAPITOLE 17 ste sa naučili, ako sa vytvárajú tabuľky. Teraz podrobnejšie od tohto bodu vám ukážeme, ako môžete nastaviť obmedzenia v tabuľkách. Obmedzenia sú súčasťou definície tabuľky, ktorá obmedzuje hodnoty, ktoré môžete zadať do stĺpcov. Až do tohto bodu v knihe boli jedinými obmedzeniami hodnôt, ktoré ste mohli zadať, to, že typ údajov a veľkosť hodnôt, ktoré ste zadali, musia byť kompatibilné so stĺpcami, v ktorých budú hodnoty umiestnené (ako špecifikované v príkaze CREATE TABLE alebo ALTER TABLE). Obmedzenia vám dávajú oveľa väčšie príležitosti a čoskoro to uvidíte. V tejto kapitole sa tiež dozviete, ako definovať predvolené hodnoty. Predvolená hodnota je hodnota, ktorá sa automaticky vloží do ľubovoľného stĺpca tabuľky, keď sa hodnota pre tento stĺpec nenachádza v príkaze INSERT pre danú tabuľku. NULL je najčastejšie používaná predvolená hodnota, ale táto kapitola vám ukáže, ako definovať iné predvolené hodnoty.

OBMEDZENIA TABUĽKY

Keď vytvárate tabuľku (alebo keď ju upravujete), môžete obmedziť hodnoty, ktoré je možné zadať do poľa. Ak to urobíte, SQL odmietne všetky hodnoty, ktoré porušujú kritériá, ktoré ste definovali. Existujú dva hlavné typy obmedzení – obmedzenie stĺpca a obmedzenie tabuľky. Rozdiel medzi nimi je v tom, že obmedzenie stĺpca sa vzťahuje iba na jednotlivé stĺpce, zatiaľ čo obmedzenie tabuľky sa vzťahuje na skupiny jedného alebo viacerých stĺpcov.

VYHLÁSENIE OBMEDZENÍ

Obmedzenie stĺpca vložíte na koniec názvu stĺpca, za typ údajov a pred čiarku. Obmedzenie tabuľky sa umiestni na koniec názvu tabuľky, za posledný názov stĺpca, ale pred konečnú zátvorku. Nasleduje syntax pre príkaz CREATE TABLE, rozšírená o obmedzenie: CREATE TABLE< table name > (< column name > < column constraint >, < column name > < data type > < column constraint > ... < table constraint > (< column name > [, < column name >])...); (Pre stručnosť sme vynechali argument size, ktorý sa niekedy používa s typom údajov.) Pohlavie údajov v zátvorkách za obmedzením tabuľky je rod, na ktorý sa toto obmedzenie vzťahuje. Obmedzenie stĺpcov sa prirodzene vzťahuje na stĺpce, ktorých názvy nasleduje. Zvyšok tejto kapitoly bude popísaný Rôzne druhy obmedzenia a ich používanie.

POUŽÍVANIE OBMEDZENÍ NA VYLÚČENIE NULOVÝCH UKAZAČOV

Pomocou príkazu CREATE TABLE môžete zabrániť poľu, aby v ňom povolilo ukazovatele NULL pomocou obmedzenia NOT NULL. Toto obmedzenie sa vzťahuje len na rôzne stĺpce.

Možno si spomínate, že NULL je špeciálne označenie, ktoré označuje pole ako prázdne. Hodnota NULL môže byť užitočná v prípadoch, keď chcete mať proti nim záruku. Je zrejmé, že primárne kľúče by nikdy nemali byť prázdne, pretože by ich to podkopalo funkčnosť. Okrem toho rody, ako sú mená, vyžadujú vo väčšine prípadov určité významy. Môžete napríklad chcieť mať meno pre každého zákazníka v tabuľke Zákazníci. Ak kľúčové slová NOT NULL umiestnite hneď za typ údajov (vrátane veľkosti) stĺpca, každý pokus o umiestnenie hodnoty NULL do tohto poľa bude zamietnutý. V opačnom prípade SQL chápe, že NULL je povolená.

Vylepšite napríklad definíciu tabuľky predajcov tým, že nepovolíme umiestňovať hodnoty NULL do stĺpcov snum alebo sname: CREATE TABLE Predajcovia(Snum celé číslo NOT, Sname char(10) NOT, city char(10), comm decimal) ; Je dôležité si zapamätať, že každý stĺpec s obmedzením NOT NULL musí byť nastavený na hodnotu v každej klauzule INSERT, ktorá ovplyvňuje tabuľku. Pri absencii NULL nemusí mať SQL žiadne hodnoty na nastavenie do týchto stĺpcov, pokiaľ už nebola priradená predvolená hodnota opísaná vyššie v tejto kapitole.

Ak váš systém podporuje použitie ALTER TABLE na pridanie nových stĺpcov do existujúcej tabuľky, pravdepodobne môžete na tieto nové stĺpce umiestniť obmedzenie stĺpcov, ako napríklad NOT NULL. Ak však zadáte hodnotu NOT NULL pre nový stĺpec, aktuálna tabuľka musí byť prázdna.

UISTITE SA, ŽE HODNOTY SÚ JEDINEČNÉ

V kapitole 17 sme diskutovali o použití jedinečných indexov, aby sme prinútili pohlavie mať inú hodnotu pre každý riadok. Táto prax zostala zo starých čias, keď SQL podporovalo obmedzenie UNIQUE. Jedinečnosť je vlastnosť údajov v tabuľke, a preto je logickejšie pomenovať ju ako obmedzenie týchto údajov, a nie jednoducho ako vlastnosť logickej odlišnosti, ktorá spája údajový objekt (index).

Jednoznačné indexy sú nepochybne jednou z najjednoduchších a najefektívnejších metód presadzovania jedinečnosti. Z tohto dôvodu niektoré implementácie obmedzenia UNIQUE používajú jedinečné indexy; to znamená, že index vytvoria bez toho, aby vám o tom povedali. Faktom zostáva, že pravdepodobnosť zámeny databázy je pomerne malá, ak vynútite jedinečnosť spolu s obmedzením.

JEDINEČNOSŤ AKO OBMEDZENIE STĹPCA

Z času na čas sa chcete uistiť, že všetky hodnoty zadané do stĺpca sa navzájom líšia. Napríklad primárne kľúče to celkom jasne ukazujú. Ak pri vytváraní tabuľky umiestnite na pole obmedzenie stĺpca UNIQUE, databáza odmietne akýkoľvek pokus zadať do tohto poľa pre jeden z riadkov hodnotu, ktorá sa už nachádza v inom riadku. Toto obmedzenie sa môže vzťahovať iba na polia, ktoré boli deklarované ako NOT NULL, pretože nemá zmysel povoliť, aby jeden riadok tabuľky mal hodnotu NULL, a potom vylúčiť ostatné riadky s hodnotami NULL ako duplikáty. Došlo k ďalšiemu vylepšeniu nášho príkazu na vytvorenie tabuľky predajcov: CREATE TABLE Predajcovia (Snum celé číslo NOT NULL UNIQUE, Sname char (10) NOT NULL UNIQUE, city char (10), comm decimal); Keď deklarujete pole s názvom ako jedinečné, uistite sa, že sú zadané dve Mary Smiths rôzne cesty- napríklad Mary Smith a M. Smith. Zároveň to nie je až také potrebné z funkčného hľadiska – pretože pole snum ako primárny kľúč stále zabezpečí, že dva riadky budú odlišné – čo je pre ľudí používajúcich údaje v tabuľkách jednoduchšie, ako si pamätať, že títo Smithovia sú nie identické. Stĺpce (nie primárne kľúče), ktorých hodnoty vyžadujú jedinečnosť, sa nazývajú kandidátske kľúče alebo jedinečné kľúče.

JEDINEČNOSŤ AKO OBMEDZENIE TABUĽKY

Skupinu polí môžete tiež definovať ako jedinečnú pomocou príkazu obmedzenia tabuľky - UNIQUE. Deklarovanie jedinečnosti skupiny polí sa líši od deklarovania jedinečných jednotlivých polí, pretože ide o kombináciu hodnôt a nie len o individuálnu hodnotu, ktorá musí byť jedinečná. Jedinečnosť skupiny je vyjadrením poradia tak, že páry riadkov s hodnotami stĺpcov „a“, „b“ a „b“, „a“ sa posudzujú oddelene od seba. Naša databáza je navrhnutá tak, že každý zákazník je priradený iba jednému predajcovi. To znamená, že každá kombinácia čísla zákazníka (cnum) a čísla predajcu (snum) v tabuľke Zákazník musí byť jedinečná. Môžete to overiť vytvorením tabuľky Zákazníci týmto spôsobom: VYTVORIŤ TABUĽKU Zákazníci (cnum celé číslo NIE JE NULL, cname char (10) NOT NULL, mesto char (10), hodnotiace celé číslo, celé číslo snum NIE JE NULL, UNIQUE (cnum, snum )) ; Všimnite si, že obe pohlavia v obmedzení tabuľky UNIQUE stále používajú obmedzenie stĺpca NOT NULL. Ak by sme v poli cnum použili obmedzenie stĺpca UNIQUE, takéto obmedzenie tabuľky by nebolo potrebné. Ak sa hodnoty poľa cnum líšia pre každý riadok, potom nemôžu existovať dva riadky s identickou kombináciou hodnôt poľa cnum a snum. To isté sa stane, ak vyhlásime pole snum za jedinečné, hoci to nebude zodpovedať nášmu príkladu, pretože predajca bude priradený viacerým zákazníkom. Preto je obmedzenie tabuľky JEDINEČNÉ, najužitočnejšie, keď nechcete nútiť jednotlivé pohlavia, aby boli jedinečné.

Povedzme napríklad, že sme vyvinuli tabuľku na sledovanie všetkých objednávok každý deň pre každého predajcu. Každý riadok takejto tabuľky predstavuje súčet čísel ľubovoľného poradia, nielen jednotlivého poradia. V tomto prípade by sme mohli niektoré eliminovať možné chyby uistite sa, že pre daného predajcu nie je na každý deň viac ako jeden riadok alebo že každá kombinácia polí snum a odate je jedinečná. Takto by sme mohli napríklad vytvoriť tabuľku s názvom Salestotal: CREATE TABLE Salestotal (cnum celé číslo NOT NULL, odate date NULL, totamt decimal, UNIQUE (snum, odate)); Existuje aj príkaz, ktorý použijete na vloženie aktuálnych údajov do tejto tabuľky: INSERT INTO Salestotal SELECT snum, odate, SUM (amt) FROM Orders GROUP BY snum, odate;

PRIMÁRNE KĽÚČOVÉ OBMEDZENIA

Predtým sme primárne kľúče považovali výlučne za logické pojmy. Aj keď vieme, čo je primárny kľúč a ako by sa mal použiť v akejkoľvek tabuľke, nevieme, či o ňom SQL „vie“. Preto sme použili UNIQUE obmedzenie alebo jedinečné indexy na primárnych kľúčoch, aby sme na nich vynútili jedinečnosť. V predchádzajúcich verziách jazyka SQL sa to vyžadovalo a dalo sa to urobiť týmto spôsobom. SQL však teraz podporuje primárne kľúče priamo s obmedzením PRIMARE KEY. Toto obmedzenie môže, ale nemusí byť dostupné vo vašom systéme.

PRIMARY KEY môže obmedziť tabuľky alebo ich stĺpce. Toto obmedzenie funguje rovnako ako obmedzenie UNIQUE s tým rozdielom, že pre danú tabuľku možno definovať iba jeden primárny kľúč (pre ľubovoľný počet stĺpcov). Rozdiel medzi primárnymi kľúčmi a jedinečnosťou stĺpca je aj v spôsobe ich použitia s cudzími kľúčmi, ktorým sa budeme venovať v kapitole 19. Syntax a definícia ich jedinečnosti sú rovnaké ako pre obmedzenie UNIQUE.

Primárne kľúče nemôžu povoliť hodnoty NULL. To znamená, že podobne ako polia v obmedzení UNIQUE, každé pole použité v obmedzení PRIMARY KEY už musí byť deklarované ako NOT NULL . Existuje vylepšená možnosť vytvárania našej tabuľky predajcov: CREATE TABLE Celkový predaj (snum celé číslo NIE JE NULL PRIMÁRNY KĽÚČ, sname char(10) NOT NULL UNIQUE, city char(10), comm desiatkové číslo); Ako vidíte, jedinečnosť (UNIQUE) polí možno deklarovať pre rovnakú tabuľku. Najlepšie je umiestniť obmedzenie PRIMARY KEY na pole (alebo polia), ktoré bude tvoriť váš jedinečný identifikátor riadka, a obmedzenie UNIQUE ponechať na polia, ktoré musia byť logicky jedinečné (napríklad telefónne čísla alebo pole mena), a nie na identifikáciu. riadkov.

PRIMÁRNE KĽÚČE PRE VIAC AKO JEDNO POLE

Obmedzenie PRIMÁRNY KĽÚČ možno použiť aj na viaceré polia, ktoré majú jedinečnú kombináciu hodnôt. Povedzme, že váš primárny kľúč je im a prvé im a posledné im máte uložené v dvoch rôznych poliach (takže môžete údaje usporiadať pomocou ktoréhokoľvek z nich). Je zrejmé, že ani prvá, ani posledná nemôže byť nútená byť sama osebe jedinečná, ale každú z týchto dvoch kombinácií môžeme urobiť jedinečnou. Obmedzenie tabuľky PRIMARY KEY môžeme aplikovať na páry: CREATE TABLE Namefield (firstname char (10) NOT NULL, lastname char (10) NOT NULL city char (10), PRIMARY KEY (krstné meno, priezvisko)); Jedným z problémov tohto prístupu je, že môžeme prinútiť objavenie sa jedinečnosti – napríklad predstavením Mary Smith a M. Smith. Môže to byť mätúce, pretože vaši zamestnanci nemusia vedieť, ktorý z nich je ktorý. Zvyčajne viac spoľahlivým spôsobom Ak chcete definovať číselné pole, ktoré dokáže rozlíšiť jeden riadok od druhého, musíte mať primárny kľúč a na dva názvy polí použiť obmedzenie UNIQUE.

KONTROLA HODNOT POĽA

Samozrejme, existuje množstvo obmedzení, ktoré môžete nastaviť na údaje zadávané do svojich tabuliek, aby ste napríklad videli, či sú údaje v príslušnom rozsahu alebo správnom formáte, čo SQL prirodzene nemôže vedieť vopred. Z tohto dôvodu vám SQL poskytuje obmedzenie CHECK, ktoré vám umožňuje nastaviť podmienku, ktorú musí hodnota zadaná do tabuľky spĺňať pred jej prijatím. Obmedzenie CHECK pozostáva z kľúčového slova CHECK, za ktorým nasleduje predikátová klauzula, ktorá používa zadané pole. Akýkoľvek pokus o úpravu alebo vloženie rodovej hodnoty, v dôsledku ktorej by bol tento predikát neplatný, bude zamietnutý.

Pozrime sa ešte raz na tabuľku predajcov. Vyjadrený je stĺpec provízie desiatkový a preto sa môže priamo vynásobiť množstvom nákupov, výsledkom čoho je výška provízie predajcu (v dolároch) so znakom dolára ($) nastaveným vpravo. Niekto možno používa pojem percento, no vy o ňom možno ani neviete. Ak osoba omylom zadá 14 namiesto 0,14 na označenie percenta provízie, bude to interpretované ako 14,0, čo je zákonná desatinná hodnota, a systém ju bude normálne akceptovať. Aby sme predišli tejto chybe, môžeme použiť obmedzenie stĺpca - SKONTROLUJTE, aby ste sa uistili, že zadaná hodnota je menšia ako 1. CREATE TABLE Predajcovia (snum celé číslo NOT NULL PRIMARY KEY, sname char(10) NOT NULL UNIQUE, city char(10), comm desiatkové KONTROLA (comm< 1));

POMOCOU -CHECK PREDBEŽNÉ URČENIE PLATNEJ VSTUPNEJ HODNOTY

Môžeme tiež použiť obmedzenie CHECK, aby sme zabránili zadávaniu určitých hodnôt do poľa, čím sa zabráni chybe. Predpokladajme napríklad, že jediné mestá, v ktorých sme mali obchodné zastúpenia, boli Londýn, Barcelona, ​​San Jose a New York. Ak poznáte všetkých predajcov pracujúcich v každom z týchto oddelení, nie je potrebné povoliť zadávanie iných hodnôt. Ak nie, použitím obmedzenia môžete zabrániť preklepom a iným chybám. VYTVORIŤ TABUĽKU Predajcovia (snum celé číslo NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, city char(10) CHECK, (mesto IN ("Londýn", "New York", "San Jose", "Barselona")), comm desiatkové KONTROLA (comm< 1)); Конечно, если вы собираетесь сделать это, вы должны быть уверены что ваша компания не открыла уже новых других ведомств сбыта. Большинство программ баз данных поддерживают команду ALTER TABLE(см. Главу 17) которая позволяет вам изменять определение таблицы, даже когда она находится в использовании. Однако, изменение или удаление ограничений не всегда возможно для этих команд, даже там где это вроде бы поддерживается. Если вы использовали систему которая не может удалять ограничения, вы будете должны создавать (CREATE) новую таблицу и передавать информацию из старой таблицы в нее всякий раз, когда вы хотите изменить ограничение. Конечно же Вы не захотите делать это часто, и со временем вообще перестанете это делать.

Vytvorme si tabuľku objednávok: CREATE TABLE Objednávky (onum integer NOT NULL UNIQUE, amt decimal, odate date NOT NULL, cnum integer NOT NULL, snum integer NOT NULL); Ako sme diskutovali v kapitole 2, typ DATE je široko podporovaný, ale nie je súčasťou štandardu ANSI. Čo by sme mali robiť, ak používame databázu, ktorá sa riadi ANSI a nepozná typ DATE? Ak deklarujeme pole odate ako ľubovoľný typ čísla, nemôžeme ako oddeľovač použiť spätnú lomku (/) ani pomlčku (-). Keďže tlačené čísla sú znaky ASCII, môžeme deklarovať typ poľa dátumu ako CHAR. Hlavným problémom je, že budeme musieť použiť jednoduché úvodzovky vždy, keď sa v dotaze odvolávame na hodnotu poľa odate. Nikdy viac jednoduché riešenie V tomto probléme sa typ DATE stal tak populárnym. Pre ilustráciu deklarujme pole odate ako typ CHAR. Môžeme naň uložiť aspoň náš formát s obmedzením CHECK: CREATE TABLE Orders (onum integer NOT NULL UNIQUE, amt decimal, odate char (10) NOT NULL CHECK (odate LIKE "--/--/--- -" ), cnum NOT NULL, snum NOT NULL); Okrem toho, ak chcete, môžete zaviesť obmedzenie, aby ste sa uistili, že zadané znaky sú čísla a že sú v rámci hodnôt nášho rozsahu.

KONTROLA STAVU NA ZÁKLADE VIACERÝCH POLÍ

Môžete tiež použiť CHECK ako obmedzenie tabuľky. Je to užitočné v prípadoch, keď chcete do podmienky zahrnúť viac ako jeden riadok. Predpokladajme, že provízie vo výške 0,15 a viac budú povolené iba predajcovi z Barcelony. Môžete to určiť pomocou nasledujúceho obmedzenia tabuľky CHECK: CREATE TABLE Predajcovia (snum celé číslo NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, city char(10), comm decimal, CHECK (comm< .15 OR city = "Barcelona")); Как вы можете видеть, два различных пол должны быть проверены чтобы определить, верен предикат или нет. Имейте в виду, что это - два разных пол одной и той же строки. Хотя вы можете использовать многочисленные поля, SQL не может проверить более одной строки одновременно. Вы не можете например использовать ограничение CHECK чтобы удостовериться что все комиссионные в данном городе одинаковы. Чтобы сделать это, SQL должен всякий раз просматривая другие строки таблицы, когда вы модифицируете или вставляете строку, видеть, что значение комиссионных указано для текущего города. SQL этого делать не умеет.

V skutočnosti by ste na vyššie uvedené mohli použiť komplexný CHECK limit, ak by ste vopred vedeli, aké by mali byť poplatky v rôznych mestách. Môžete napríklad nastaviť obmedzenie takto: CHECK ((comm = 0,15 AND clty = "Londýn") ALEBO (comm = 0,14 AND mesto = "Barcelona") ALEBO (comm = 11 AND mesto = "San Jose" ) ..) Dostanete nápad. Namiesto uloženia takejto množiny obmedzení môžete jednoducho použiť pohľad s klauzulou WITH CHECK OPTION, ktorá má vo svojom predikáte všetky tieto podmienky (pozri kapitolu 20 pre pohľad aj WITH CHECK OPTION). Používatelia môžu pristupovať k zobrazeniu tabuľky namiesto samotnej tabuľky. Jednou z výhod toho bude, že postup zmeny obmedzenia nebude taký bolestivý ani časovo náročný. Zobrazenie WITH CHECK OPTION je dobrou náhradou za obmedzenie CHECK, ako bude uvedené v kapitole 21.

NASTAVENIE VÝCHOZÍCH HODNOT

Keď vložíte riadok do tabuľky bez toho, aby ste v ňom zadali hodnoty pre každé pole, SQL musí mať predvolenú hodnotu, aby ho mohol zahrnúť do konkrétneho poľa, inak bude príkaz odmietnutý. Najbežnejšia predvolená hodnota je NULL. Toto je predvolená hodnota pre každý stĺpec, ktorý nemá obmedzenie NOT NULL alebo ktorý má iné predvolené priradenie.

Hodnota DEFAULT sa zadáva v príkaze CREATE TABLE rovnakým spôsobom ako obmedzenie stĺpca, hoci technicky vzaté, hodnota DEFAULT nie je obmedzujúcou vlastnosťou – neobmedzuje hodnoty, ktoré môžete zadať, ale jednoducho určuje, čo môže sa stane, ak nezadáte žiadne z nich. Povedzme, že pracujete v kancelárii v New Yorku a drvivá väčšina vašich predajcov žije v New Yorku. Môžete zadať New York ako predvolenú hodnotu pohlavia mesta pre tabuľku predajcov: CREATE TABLE Predajcovia (snum celé číslo NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, city char(10) DEFAULT = "New York", comm desiatkové KONTROLA (komunik< 1); Конечно, вводить значение Нью Йорк в таблицу каждый раз когда назначается новый продавец, не такая уж необходимость, и можно просто пренебречь им (не ввод его) даже если оно должно иметь некоторое значение. Значение по умолчанию такого типа, более предпочтительно, чем, например, длинный конторский номер указывающий на ваше собственное ведомство, в таблице Порядков. Длинные числовые значения - более расположены к ошибке, поэтому если подавляющее большинство (или все) ваших порядков должны иметь ваш собственный конторский номер, желательно устанавливать для них значение по умолчанию.

Ďalším spôsobom, ako použiť predvolenú hodnotu, je použiť ju ako alternatívu k NULL. Keďže NULL je (v skutočnosti) nepravdivá pri akomkoľvek inom porovnaní ako IS NULL, dá sa odstrániť pomocou väčšiny predikátov. Niekedy musíte vidieť prázdne hodnoty svojich polí bez toho, aby ste ich nejakým spôsobom spracovávali. Môžete nastaviť predvolenú hodnotu, ako je nula alebo medzera, ktorá má funkčne menšiu hodnotu ako nenastavená hodnota – NULL. Rozdiel medzi nimi a bežnou hodnotou NULL je v tom, že SQL s nimi bude zaobchádzať rovnako ako s akoukoľvek inou hodnotou.

Predpokladajme, že zákazníkom nie sú na začiatku priradené odhady. Každých šesť mesiacov zvyšujete hodnotenie všetkým svojim zákazníkom, ktorí majú podpriemerné hodnotenie, vrátane tých, ktorí predtým žiadne hodnotenie nemali. Ak chcete vybrať všetkých týchto zákazníkov ako skupinu, nasledujúci dotaz vylúči všetkých zákazníkov s hodnotením = NULL: SELECT * FROM Customers WHERE hodnotenie< = 100; Однако, если вы назначили значение по умолчанию = 000, в поле rating, заказчики без оценок будут выбраны наряду с другими. Приоритет каждого метода - зависит от ситуации. Если вы будете делать запрос с помощью пол оценки, то захотите ли Вы включить строки без значений, или исключите их? Друга характеристика значений по умолчанию этого типа, позволит объявить Вам поле оценки - как NOT NULL. Если вы используете его по умолчанию, чтобы избежать значений = NULL, то это - вероятно хороша защита от ошибок.

V tomto poli môžete použiť aj obmedzenia UNIQUE alebo PRIMARY KEY. Ak to urobíte, znamená to, že iba jeden riadok môže mať predvolenú hodnotu. Každý riadok, ktorý obsahuje predvolenú hodnotu, bude potrebné pred vložením ďalšieho riadka s predvolenou hodnotou upraviť. Toto nie je spôsob, akým bežne používate predvolené hodnoty, takže obmedzenia UNIQUE a PRIMARY KEY (najmä posledné) sa zvyčajne nenastavujú na riadkoch s predvolenými hodnotami.

SÚHRN

Teraz máte niekoľko spôsobov, ako ovládať hodnoty, ktoré je možné zadávať do vašich tabuliek. Obmedzenie NOT NULL môžete použiť na vylúčenie hodnôt NULL, obmedzenie UNIQUE na vynútenie toho, aby sa všetky hodnoty v skupine jedného alebo viacerých stĺpcov navzájom líšili, obmedzenie PRIMÁRNY KĽÚČ robiť v podstate to isté ako UNIQUE, ale s iný koniec a nakoniec obmedzenie CHECK na definovanie vlastných vlastných podmienok, aby bolo možné zadať hodnoty, s ktorými sa pred nimi stretnete. Prípadne môžete použiť klauzulu DEFAULT, ktorá automaticky vloží predvolenú hodnotu do každého poľa, ktorého názov nie je zadaný v INSERT, rovnako ako sa vloží hodnota NULL, keď nie je nastavená klauzula DEFAULT a neexistuje obmedzenie NOT NULL. Obmedzenia FOREIGN KEY alebo REFERENCES, o ktorých sa dozviete v kapitole 19, sú im veľmi podobné, až na to, že spájajú skupinu jedného alebo viacerých polí s inou skupinou, a teda okamžite ovplyvňujú hodnoty, ktoré je možné zadať. niektorú z týchto skupín.

PRÁCA S SQL

1. Vytvorte tabuľku objednávky tak, aby sa všetky hodnoty polí onum, ako aj všetky kombinácie polí cnum a snum navzájom líšili, a aby hodnoty NULL boli vylúčené z poľa dátumu.

2. Vytvorte tabuľku predaja tak, aby predvolená provízia bola 10 %, nepovoľovala hodnoty NULL, aby pole snum bolo primárnym kľúčom a aby boli všetky názvy v abecednom poradí od A do M vrátane (majte na pamäti, že všetky mená budú vytlačené veľkými písmenami).

3. Vytvorte tabuľku objednávok a uistite sa, že pole onum je väčšie ako pole cnum a cnum je väčšie ako pole snum. Hodnoty NULL nie sú povolené v žiadnom z týchto troch polí.

Obmedzenie UNIKÁTNY V SQL umožňuje identifikovať každý záznam v tabuľke.

Ak vyhovuje obmedzenie stĺpca UNIKÁTNY v poli pri vytváraní tabuľky, databáza odmietne akýkoľvek pokus zadať do tohto poľa pre jeden z riadkov hodnotu, ktorá sa už nachádza v inom riadku. Toto obmedzenie sa môže vzťahovať iba na polia, ktoré boli vyhlásené za neprázdne ( NIE JE NULL), pretože nemá zmysel nechať jeden riadok tabuľky hodnotu NULOVÝ a potom vylúčte ďalšie riadky pomocou NULOVÝ hodnoty ako duplikáty.

SQL Server/Oracle/Access

Príklad vytvorenia tabuľky SQL s obmedzením UNIKÁTNY:

VYTVORIŤ TABUĽKUŠtudent

(Kod_stud celé číslo NIE JE NULL UNIQUE,

Fam char (30) NIE JE NULL UNIQUE,

Adresy char (50),

Keď je pole Fam deklarované ako jedinečné, dve Smirnova Maria môžu byť zadané rôznymi spôsobmi – napríklad Smirnova Maria a Smirnova M. Stĺpce (nie primárne kľúče), ktorých hodnoty vyžadujú jedinečnosť, sa nazývajú kandidátske kľúče alebo jedinečné kľúče. Skupinu polí môžete definovať ako jedinečnú pomocou príkazu table constraint - UNIKÁTNY. Vyhlásenie skupiny polí za jedinečné sa líši od vyhlásenia jednotlivých polí za jedinečné, pretože ide o kombináciu hodnôt, nielen o individuálnu hodnotu, ktorá musí byť jedinečná. Jedinečnosť skupiny spočíva v tom, že páry riadkov s hodnotami stĺpcov „a“, „b“ a „b“, „a“ boli posudzované oddelene od seba.

Ak databáza určí, že každá špecializácia patrí len jednému oddeleniu, potom každá kombinácia kódu oddelenia (Kod_f) a kódu špecializácie (Kod_spec) v tabuľke Spec musí byť jedinečná. Napríklad:

VYTVORIŤ TABUĽKUŠpec
(Kod_spec celé číslo NIE JE NULL,
Kod_f celé číslo NIE JE NULL,
Nazv_spec char (50) NIE JE NULL,
UNIKÁTNY(Kod_spec, Kod_f));

Obe polia v obmedzení tabuľky UNIQUE stále používajú obmedzenie stĺpca - NIE JE NULL. Ak sa používa obmedzenie stĺpec UNIKÁTNY pre pole Kod_spec toto obmedzenie tabuľky by boli voliteľné. Ak je hodnota poľa Kod_spec odlišná pre každý riadok, potom nemôžu existovať dva riadky s identickou kombináciou hodnôt poľa Kod_spec a Kod_f. Obmedzenie tabuľky UNIKÁTNY najužitočnejšie, keď jednotlivé polia nemusia byť jedinečné.

MySQL JEDINEČNÉ

Príklad vytvorenia tabuľky Osoby v MySQL s obmedzením UNIKÁTNY:

VYTVORIŤ TABUĽKU Osoby (
P_Id int NIE JE NULL,
Priezvisko varchar(255) NIE JE NULL,
Meno varchar(255),
Adresa varchar(255),
Mesto varchar(255),
UNIKÁTNY(P_Id)
);

Odstráňte UNIKÁTNE obmedzenie

Ak po vytvorení obmedzenia UNIKÁTNY a v prípade, keď UNIKÁTNE obmedzenie nedáva zmysel UNIKÁTNY možno vymazať. Na tento účel použite nasledujúce SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE názov_tabuľky OBMEDZENIE DROP uc_PersonID;

ALTER TABLE názov_tabuľky DROP INDEX uc_PersonID;

Obmedzenie UNIQUE jedinečne identifikuje každý záznam v databázovej tabuľke.

Jedinečný stĺpec alebo sada stĺpcov s obmedzením PRIMÁRNY KĽÚČ poskytuje jedinečnú záruku.

Obmedzenie PRIMÁRNY KĽÚČ má automaticky definované obmedzenie jedinečnosti.

Všimnite si, že každá tabuľka môže mať viacero jedinečných obmedzení, ale každá tabuľka môže mať len jedno obmedzenie primárneho kľúča.

CREATE TABLE SQL UNIQUE obmedzenie kedy

Nasledujúce SQL, keď bola vytvorená tabuľka "Osoby", na vytvorenie jedinečného obmedzenia v stĺpci "p_id":

VYTVORIŤ TABUĽKU Osoby
P_Id int NOT NULL,

Meno varchar(255),
Adresa varchar(255),
Mesto varchar(255),
UNIQUE (P_Id)
)

SQL Server / Oracle / MS Access:

VYTVORIŤ TABUĽKU Osoby
P_Id int NOT NULL UNIQUE,
Priezvisko varchar(255) NOT NULL,
Meno varchar(255),
Adresa varchar(255),
Mesto varchar(255)
)

Ak chcete pomenovať jedinečné obmedzenia UNIQUE obmedzenia a definovať viacero stĺpcov, použite nasledujúcu syntax SQL:

VYTVORIŤ TABUĽKU Osoby
P_Id int NOT NULL,
Priezvisko varchar(255) NOT NULL,
Meno varchar(255),
Adresa varchar(255),
Mesto varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id, LastName)
)

SQL UNIQUE obmedzenie ALTER TABLE keď

Po vytvorení tabuľky vytvorte jedinečné obmedzenie v stĺpci "p_id", použite nasledujúci SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Osoby
PRIDAŤ JEDINEČNÉ (P_Id)

Ak chcete pomenovať jedinečné obmedzenia UNIQUE obmedzenia a definovať viacero stĺpcov, použite nasledujúcu syntax SQL.