Եզակի sql օրինակներ. SQL UNIQUE սահմանափակում. Նախադրյալների կարգավորում

Վերջին թարմացում: 09.07.2017

T-SQL-ում սյունակներ ստեղծելիս մենք կարող ենք օգտագործել մի շարք ատրիբուտներ, որոնցից մի քանիսը սահմանափակումներ են: Եկեք նայենք այս հատկանիշներին:

ՀԻՄՆԱԿԱՆ ԲԱՆԱԼ

Սյունակը հիմնական բանալի դարձնելու համար կարող եք օգտագործել PRIMARY KEY արտահայտությունը:

ՍՏԵՂԱՆԻ ՍՏԵՂԾԵՔ Հաճախորդներ (Id INT PRIMARY KEY, Տարիքը INT, Անուն NVARCHAR(20), Ազգանուն NVARCHAR(20), Էլփոստ VARCHAR(30), Հեռախոս VARCHAR(20))

Առաջնային բանալին եզակի կերպով նույնականացնում է աղյուսակի տողը: Պարտադիր չէ, որ int տիպի սյունակները լինեն հիմնական բանալին, դրանք կարող են լինել ցանկացած այլ տիպ:

Սեղանի մակարդակում առաջնային բանալին սահմանելը.

ՍՏԵՂԱՆԻ ՍՏԵՂԾԵՔ Հաճախորդներ (Id INT, Տարիքը INT, Անուն NVARCHAR(20), Ազգանուն NVARCHAR(20), էլ.

Առաջնային բանալին կարող է լինել բարդ բանալի: Նման բանալի կարող է պահանջվել, եթե մենք ունենք միանգամից երկու սյունակ, որոնք պետք է եզակիորեն նույնացնեն աղյուսակի տողը: Օրինակ:

ՍԵՂԱՆԱԿԻ ՍՏԵՂԾԵՔ Պատվերների գծեր (OrderId INT, ProductId INT, Քանակ INT, Գին ՓՈՂ, ՀԻՄՆԱԿԱՆ ԲԱՆԱԼ (OrderId, ProductId))

Այստեղ OrderId և ProductId դաշտերը միասին գործում են որպես կոմպոզիտային առաջնային բանալի: Այսինքն, OrderLines աղյուսակում չի կարող լինել երկու տող, որտեղ այս երկու դաշտերը միաժամանակ ունենան նույն արժեքները:

ԻՆՔՆՈՒԹՅՈՒՆ

IDENTITY հատկանիշը թույլ է տալիս սյունակը դարձնել նույնացուցիչ: Այս հատկանիշը կարող է վերագրվել INT, SMALLINT, BIGINT, TYNIINT, DECIMAL և NUMERIC թվային տիպերի սյունակներին: Աղյուսակում նոր տվյալներ ավելացնելիս SQL Serverկավելացնի այս սյունակի արժեքը վերջին գրառումում մեկով: Որպես կանոն, նույնացուցիչը նույն սյունակն է, որը հիմնական բանալին է, թեև սկզբունքորեն դա անհրաժեշտ չէ:

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Տարիքը INT, Անուն NVARCHAR(20), Ազգանուն NVARCHAR(20), Էլ. VARCHAR(30), Հեռախոս VARCHAR(20))

Կարող եք նաև օգտագործել հատկանիշի ամբողջական ձևը.

IDENTITY (սերմ, ավելացում)

Այստեղ seed պարամետրը ցույց է տալիս սկզբնական արժեքը, որից կսկսվի հետհաշվարկը: Իսկ աճող պարամետրը որոշում է, թե որքանով կավելանա հաջորդ արժեքը: Լռելյայնորեն հատկանիշը օգտագործում է հետևյալ արժեքները.

ԻՆՔՆՈՒԹՅՈՒՆ (1, 1)

Այսինքն՝ հետհաշվարկը սկսվում է 1-ից։ Իսկ հաջորդ արժեքները մեկով ավելանում են։ Բայց մենք կարող ենք անտեսել այս պահվածքը: Օրինակ:

ID INT IDENTITY (2, 3)

Այս դեպքում հետհաշվարկը կսկսվի 2-ից, և յուրաքանչյուր հաջորդ մուտքի արժեքը կաճի 3-ով։ Այսինքն՝ առաջին տողը կունենա 2 արժեքը, երկրորդը՝ 5, երրորդը՝ 8 և այլն։

Նկատի ունեցեք նաև, որ աղյուսակի միայն մեկ սյունակ պետք է ունենա այս հատկանիշը:

ՅՈՒՐԱՔԱՆԱԿԱՆ

Եթե ​​ցանկանում ենք, որ սյունակը ունենա միայն եզակի արժեքներ, ապա մենք կարող ենք սահմանել ՈՒՆԻԿ հատկանիշ դրա համար:

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Age INT, Name NVARCHAR(20), Last Name NVARCHAR(20), Email VARCHAR(30) UNIQUE, Հեռ.

Այս դեպքում սյունակները, որոնք ներկայացնում են էլեկտրոնային հասցեիսկ հեռախոսը կունենա յուրահատուկ արժեքներ։ Եվ մենք չենք կարողանա աղյուսակում ավելացնել երկու տող, որոնց արժեքները այս սյունակների համար նույնը կլինեն:

Մենք կարող ենք նաև սահմանել այս հատկանիշը աղյուսակի մակարդակում.

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Տարիքը INT, Անուն NVARCHAR(20), Ազգանուն NVARCHAR(20), Էլ.

NULL և NOT NULL

Նշելու համար, թե արդյոք սյունակը կարող է զրոյական լինել, դուք կարող եք նրան տալ NULL կամ NOT NULL հատկանիշը սյունակը սահմանելիս: Եթե ​​այս հատկանիշը բացահայտորեն չօգտագործվի, սյունակը լռելյայն կլինի NULL: Բացառություն է, երբ սյունակը գործում է որպես հիմնական բանալի, որի դեպքում սյունակի լռելյայն արժեքը NOT NULL է:

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Տարիքը INT, անուն NVARCHAR(20) NOT NULL, ազգանուն NVARCHAR(20) NOT NULL, էլ.

ԼԱՆԿԱԴՐՎԱԾ

DEFAULT հատկանիշը նշում է սյունակի լռելյայն արժեքը: Եթե ​​տվյալներ ավելացնելիս սյունակի համար արժեք չի տրամադրվում, դրա համար կօգտագործվի լռելյայն արժեքը:

CREATE TABLE Customers (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, First Name NVARCHAR(20) NOT NULL, Lastname NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHUE(Phone VARCHUE));

Այստեղ Տարիքը սյունակն ունի 18 լռելյայն արժեք:

ՍՏՈՒԳՈՒՄ

CHECK հիմնաբառը սահմանում է արժեքների տիրույթի սահմանափակում, որը կարող է պահվել սյունակում: Դրա համար CHECK բառից հետո փակագծերում նշվում է պայման, որին պետք է համապատասխանեն սյունակը կամ մի քանի սյունակները։ Օրինակ, հաճախորդների տարիքը չի կարող լինել 0-ից պակաս կամ 100-ից ավելի.

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Տարիքը ԼԱՆԿԱԴՐՎԱԾ 18 CHECK (տարիքը >0 ԵՎ Տարիքը< 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE CHECK(Email !=""), Phone VARCHAR(20) UNIQUE CHECK(Phone !=""));

Այն նաև սահմանում է, որ Email և Phone սյունակները չեն կարող ունենալ դատարկ տող որպես արժեք (դատարկ տողը համարժեք չէ NULL արժեքին):

AND բանալի բառն օգտագործվում է պայմանները միացնելու համար: Պայմանները կարող են սահմանվել համեմատական ​​գործողությունների տեսքով ավելի մեծ, քան (>), ավելի փոքր, քան (<), не равно (!=).

Դուք կարող եք նաև օգտագործել CHECK՝ որպես ամբողջություն աղյուսակի սահմանափակում ստեղծելու համար.

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿԻ Հաճախորդներ (Id INT PRIMARY KEY IDENTITY, Տարիքը INT DEFAULT 18, Անունը NVARCHAR(20) NOT NULL, ազգանուն NVARCHAR(20) NOT NULL, էլ. 0 ԵՎ Տարիքը<100) AND (Email !="") AND (Phone !="")))

ՍԱՀՄԱՆԱՓԱԿՄԱՆ օպերատոր. Սահմանեք սահմանափակումների անվանումը:

Օգտագործելով հիմնաբառ CONSTRAINT-ը թույլ է տալիս սահմանել սահմանափակումների անուն: ՀԻՄՆԱԿԱՆ ԲԱՆԱԼԸ, ԵԶԱԿԱԼԸ, ԼԱՆԿԱԴՐՎԱԾԸ, ՍՏՈՒԳՈՒՄԸ կարող են օգտագործվել որպես սահմանափակումներ:

Սահմանափակումների անունները կարող են նշվել սյունակի մակարդակում: Դրանք նշված են CONSTRAINT-ից հետո՝ նախքան ատրիբուտները.

CREATE TABLE Հաճախորդներ (Id INT CONSTRAINT PK_Customer_Id PRIMARY KEY IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18 CONSTRAINT CK_Customer_Age CHECK(Տարիքը >0 և Տարիքը< 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)

Սահմանափակումները կարող են ունենալ կամայական անուններ, սակայն, որպես կանոն, օգտագործվում են հետևյալ նախածանցները.

    «PK_» - ՀԻՄՆԱԿԱՆ ԲԱՆԱԼԻ համար

    «FK_» - ԱՐՏԱՔԻՆ ԲԱՆԱԼԻ համար

    «CK_» - CHECK-ի համար

    «UQ_» - ՅՈՒՐԱՔԱՆԱԿԱՆԻ համար

    «DF_» - DEFAULT-ի համար

Սկզբունքորեն, անհրաժեշտ չէ նշել սահմանափակումների անունները, երբ դուք սահմանում եք համապատասխան ատրիբուտները, SQL Server-ը ավտոմատ կերպով որոշում է դրանց անունները: Բայց, իմանալով սահմանափակման անվանումը, մենք կարող ենք մուտք գործել այն, օրինակ՝ ջնջելու համար։

Եվ դուք կարող եք նաև սահմանել բոլոր սահմանափակումների անունները աղյուսակի ատրիբուտների միջոցով.

CREATE TABLE Հաճախորդներ (Id INT IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18, անուն NVARCHAR(20) NOT NULL, ազգանուն NVARCHAR(20) NOT NULL, էլ. MARY KEY (ID) , CONSTRAINT CK_Customer_Age CHECK(Տարիքը >0 ԵՎ Տարիքը< 100), CONSTRAINT UQ_Customer_Email UNIQUE (Email), CONSTRAINT UQ_Customer_Phone UNIQUE (Phone))

Սահմանափակում ՅՈՒՐԱՔԱՆԱԿԱՆՎ SQLթույլ է տալիս բացահայտել աղյուսակի յուրաքանչյուր գրառում:

Եթե ​​սյունակի սահմանափակումը համապատասխանում է ՅՈՒՐԱՔԱՆԱԿԱՆդաշտում աղյուսակ ստեղծելիս տվյալների բազան կհրաժարվի այդ դաշտում տողերից մեկի համար մուտքագրելու ցանկացած փորձ, որն արդեն առկա է մեկ այլ տողում: Այս սահմանափակումը կարող է կիրառվել միայն այն դաշտերի վրա, որոնք հայտարարվել են ոչ դատարկ ( ՈՉ ԶՐՈՒՅՑ), քանի որ իմաստ չունի աղյուսակի մեկ տողն արժեք ունենալ ԴԱՏԱՐԿև այնուհետև բացառել այլ տողեր ԴԱՏԱՐԿարժեքները որպես կրկնօրինակներ:

SQL Server/Oracle/Access

Սեղանի ստեղծման օրինակ SQLսահմանափակմամբ ՅՈՒՐԱՔԱՆԱԿԱՆ:

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵԼՈւսանող

(Kod_stud ամբողջ թիվ ՈՉ ԶՐՈՒՅԱԿ ՅՈՒՐԱՔԱԿԱՆ,

Հայտնի կերպար (30) ՈՉ ԶՐՈՒՅԱԿ ՅՈՒՐԱՔԱԿԱՆ,

Հասցեներ char (50),

Երբ Fam դաշտը հայտարարվում է եզակի, կարելի է մուտքագրել երկու Smirnov Mary տարբեր ճանապարհներ- օրինակ, Smirnova Maria և Smirnova M. Սյունակները (ոչ առաջնային բանալիներ), որոնց արժեքները պահանջում են եզակիություն, կոչվում են թեկնածու բանալիներ կամ եզակի բանալիներ: Դուք կարող եք դաշտերի խումբ սահմանել որպես եզակի՝ օգտագործելով աղյուսակի սահմանափակման հրամանը. ՅՈՒՐԱՔԱՆԱԿԱՆ. Դաշտերի խումբը եզակի հայտարարելը տարբերվում է առանձին դաշտերը եզակի հայտարարելուց, քանի որ դա արժեքների համակցություն է, այլ ոչ միայն անհատական ​​արժեք, որը պետք է եզակի լինի: Խմբի եզակիությունը կայանում է նրանում, որ «a», «b» և «b», «a» սյունակային արժեքներով զույգ տողերը դիտարկվել են միմյանցից առանձին:

Եթե ​​տվյալների բազան որոշում է, որ յուրաքանչյուր մասնագիտություն պատկանում է մեկ և միայն մեկ բաժին, ապա Spec աղյուսակում բաժնի կոդի (Kod_f) և մասնագիտության կոդի (Kod_spec) յուրաքանչյուր համակցություն պետք է լինի եզակի: Օրինակ:

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵԼՏեսակ
(Kod_spec ամբողջ թիվ ՈՉ ԶՐՈՒՅՑ,
Kod_f ամբողջ թիվ ՈՉ ԶՐՈՒՅՑ,
Nazv_spec char (50) ՈՉ ԶՐՈՒՅՑ,
ՅՈՒՐԱՔԱՆԱԿԱՆ(Kod_spec, Kod_f));

UNIQUE աղյուսակի սահմանափակման երկու դաշտերը դեռ օգտագործում են սյունակի սահմանափակումը. ՈՉ ԶՐՈՒՅՑ. Եթե ​​օգտագործվում է սահմանափակումսյունակ ՅՈՒՐԱՔԱՆԱԿԱՆ Kod_spec դաշտի համար սա սահմանափակումսեղանները կամընտիր կլինեն: Եթե ​​Kod_spec դաշտի արժեքը տարբեր է յուրաքանչյուր տողի համար, ապա չի կարող լինել երկու տող՝ Kod_spec և Kod_f դաշտերի արժեքների նույնական համադրությամբ: Սահմանափակումսեղաններ ՅՈՒՐԱՔԱՆԱԿԱՆառավել օգտակար է, երբ առանձին դաշտերը պետք չէ եզակի լինել:

MySQL ՅՈՒՐԱՔԱՆԱԿԱՆ

Անձերի աղյուսակ ստեղծելու օրինակ MySQLսահմանափակմամբ ՅՈՒՐԱՔԱՆԱԿԱՆ:

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵԼանձեր (
P_Id int ՈՉ ԶՐՈՒՅՑ,
Ազգանուն varchar(255) ՈՉ ԶՐՈՒՅՑ,
Անուն varchar(255),
Հասցե varchar(255),
Քաղաք Վարճար(255),
ՅՈՒՐԱՔԱՆԱԿԱՆ(P_Id)
);

Հեռացնել ՈՒՆԻԿ սահմանափակումը

Եթե ​​ստեղծումից հետո սահմանափակումներ ՅՈՒՐԱՔԱՆԱԿԱՆիսկ այն դեպքում, երբ ԵՍԿԱԿԱՆ սահմանափակումիմաստ չունի ՅՈՒՐԱՔԱՆԱԿԱՆկարող է ջնջվել: Դա անելու համար օգտագործեք հետևյալը SQL:

SQL Server / Oracle / MS Access:

ՓՈՓՈԽԵԼ ՍԵՂԱՆԱԿսեղանի_անուն ԿԱԹԵԼ ՍԱՀՄԱՆԱՓԱԿՈՒՄ uc_PersonID;

ՓՈՓՈԽԵԼ ՍԵՂԱՆԱԿսեղանի_անուն ԿԱԹԵԼ ԻԴԵՔՍ uc_PersonID;

17-րդ ԳԼՈՒԽՈՒՄ դուք սովորեցիք, թե ինչպես են ստեղծվում աղյուսակները: Այժմ այս կետից ավելի մանրամասն մենք ձեզ ցույց կտանք, թե ինչպես կարող եք սահմանափակումներ սահմանել աղյուսակներում: Սահմանափակումները աղյուսակի սահմանման մի մասն են, որը սահմանափակում է այն արժեքները, որոնք կարող եք մուտքագրել սյունակներում: Գրքում մինչև այս պահը, արժեքների միակ սահմանափակումները, որոնք դուք կարող էիք մուտքագրել, այն էր, որ ձեր մուտքագրած արժեքների տվյալների տեսակը և չափը պետք է համատեղելի լինեն այն սյունակների հետ, որոնցում կտեղադրվեն արժեքները (ինչպես. նշված է CREATE TABLE հրամանում կամ ALTER TABLE հրամանում): Սահմանափակումները զգալիորեն տալիս են ձեզ մեծ հնարավորություններև շուտով դուք դա կտեսնեք: Դուք նաև կսովորեք, թե ինչպես սահմանել լռելյայն արժեքները այս գլխում: Լռելյայն արժեքն է, որն ավտոմատ կերպով տեղադրվում է աղյուսակի ցանկացած սյունակում, երբ այդ սյունակի արժեքը չկա այդ աղյուսակի INSERT հրամանում: NULL-ը ամենաշատ օգտագործվող լռելյայն արժեքն է, սակայն այս գլուխը ցույց կտա ձեզ, թե ինչպես սահմանել այլ լռելյայն արժեքներ:

ՍԵՂԱՆԻ ՍԱՀՄԱՆԱՓԱԿՈՒՄՆԵՐ

Աղյուսակ ստեղծելիս (կամ այն ​​փոփոխելիս), կարող եք սահմանափակում դնել դաշտում մուտքագրվող արժեքների վրա: Եթե ​​դուք դա անեք, SQL-ը կմերժի ձեր կողմից սահմանված չափանիշները խախտող ցանկացած արժեք: Կան երկու հիմնական տեսակի սահմանափակումներ՝ սյունակի սահմանափակում և աղյուսակի սահմանափակում: Երկուսի միջև տարբերությունն այն է, որ սյունակի սահմանափակումը կիրառվում է միայն առանձին սյունակների վրա, մինչդեռ աղյուսակի սահմանափակումը վերաբերում է մեկ կամ մի քանի սյունակների խմբերին:

ՍԱՀՄԱՆԱՓԱԿՈՒՄՆԵՐԻ ՀԱՅՏԱՐԱՐՈՒՄ

Դուք տեղադրում եք սյունակի սահմանափակում սյունակի անվան վերջում, տվյալների տեսակից հետո և ստորակետից առաջ: Աղյուսակի սահմանափակումը դրվում է աղյուսակի անվան վերջում, վերջին սյունակի անունից հետո, բայց վերջնական փակագծից առաջ: Ստորև բերված է CREATE TABLE հրամանի շարահյուսությունը, որը ընդլայնվել է՝ ներառելով սահմանափակում՝ CREATE TABLE:< table name > (< column name > < column constraint >, < column name > < data type > < column constraint > ... < table constraint > (< column name > [, < column name >])...); (Հակիրճության համար մենք բաց ենք թողել չափի արգումենտը, որը երբեմն օգտագործվում է տվյալների տեսակի հետ:) Աղյուսակի սահմանափակումից հետո փակագծերում տրված տվյալների սեռը այն սեռն է, որի նկատմամբ կիրառվում է այդ սահմանափակումը: Սյունակի սահմանափակումը, բնականաբար, կիրառվում է այն սյունակների վրա, որոնց անունները հետևում են: Այս գլխի մնացած մասը նկարագրելու է Տարբեր տեսակներսահմանափակումները և դրանց օգտագործումը:

ՍԱՀՄԱՆԱՓԱԿՆԵՐԻ ՕԳՏԱԳՈՐԾՈՒՄԸ՝ ԱՆՎԱՐ ՑՈՒՑԻՉՆԵՐԸ ԲԱՑԱՌՄԱՆ ՀԱՄԱՐ

Դուք կարող եք օգտագործել CREATE TABLE հրամանը, որպեսզի դաշտը թույլ չտա NULL ցուցիչներ՝ օգտագործելով NOT NULL սահմանափակումը: Այս սահմանափակումը վերաբերում է միայն տարբեր սյունակներին:

Դուք կարող եք հիշել, որ NULL-ը հատուկ նշանակում է, որը նշում է դաշտը որպես դատարկ: NULL-ը կարող է օգտակար լինել, երբ կան դեպքեր, երբ դուք ցանկանում եք երաշխավորված լինել դրանց դեմ: Ակնհայտ է, որ առաջնային բանալիները երբեք չպետք է դատարկ լինեն, քանի որ դա կխաթարի դրանք ֆունկցիոնալությունը. Բացի այդ, սեռերը, ինչպիսիք են անունները, շատ դեպքերում պահանջում են որոշակի իմաստներ: Օրինակ, դուք կարող եք ցանկանալ յուրաքանչյուր հաճախորդի անուն ունենալ Հաճախորդների աղյուսակում: Եթե ​​NOT NULL հիմնաբառերը տեղադրեք սյունակի տվյալների տեսակից (ներառյալ չափը) անմիջապես հետո, այդ դաշտում NULL արժեք տեղադրելու ցանկացած փորձ կմերժվի: Հակառակ դեպքում SQL-ը հասկանում է, որ NULL-ը թույլատրված է:

Օրինակ, եկեք բարելավենք մեր Վաճառողների աղյուսակի սահմանումը` թույլ չտալով NULL արժեքներ տեղադրել snum կամ sname սյունակներում. CREATE TABLE Salespeople (Snum integer NOT, Sname char (10) NOT, city char (10), comm տասնորդական) ; Կարևոր է հիշել, որ NOT NULL սահմանափակում ունեցող ցանկացած սյունակ պետք է սահմանվի արժեքի յուրաքանչյուր INSERT կետում, որն ազդում է աղյուսակի վրա: NULL-ի բացակայության դեպքում, SQL-ը կարող է արժեքներ չունենալ այս սյունակներում սահմանելու համար, բացառությամբ այն դեպքերի, երբ այս գլխում ավելի վաղ նկարագրված լռելյայն արժեքը արդեն նշանակված չէ:

Եթե ​​ձեր համակարգն աջակցում է ALTER TABLE-ի օգտագործումը՝ գոյություն ունեցող աղյուսակում նոր սյունակներ ավելացնելու համար, դուք, հավանաբար, կարող եք տեղադրել սյունակի սահմանափակում, օրինակ՝ NOT NULL, այս նոր սյունակների վրա: Այնուամենայնիվ, եթե նոր սյունակի համար նշեք NOT NULL արժեք, ընթացիկ աղյուսակը պետք է դատարկ լինի:

Համոզվեք, որ ԱՐԺԵՔՆԵՐԸ ԵՆԹԱԿԱՆ ԵՆ

Գլուխ 17-ում մենք քննարկեցինք եզակի ինդեքսների օգտագործումը սեռին ստիպելու համար տարբեր իմաստներյուրաքանչյուր տողի համար: Այս պրակտիկան մնացել է հին ժամանակներից, երբ SQL-ն աջակցում էր ՈՒՆԻԿ սահմանափակումը: Եզակիությունը աղյուսակի տվյալների հատկությունն է, և, հետևաբար, ավելի տրամաբանական է այն անվանել որպես այդ տվյալների սահմանափակում, այլ ոչ թե պարզապես որպես տրամաբանական տարբերության հատկություն, որը կապում է տվյալների օբյեկտը (ինդեքսը):

Անկասկած, եզակի ինդեքսները եզակիության կիրառման ամենապարզ և արդյունավետ մեթոդներից են: Այս պատճառով, UNIQUE սահմանափակումների որոշ իրականացումներ օգտագործում են եզակի ինդեքսներ. այսինքն՝ ստեղծում են ինդեքսը՝ առանց ձեզ դրա մասին ասելու։ Փաստը մնում է փաստ, որ տվյալների բազայի շփոթության հավանականությունը բավականին փոքր է, եթե դուք սահմանափակում եք եզակիությունը:

ԵԶՐԱԿԻՈՒԹՅՈՒՆԸ ՈՐՊԵՍ ՍՅՈՒՆԱԿԱՆ ՍԱՀՄԱՆԱՓԱԿՈՒՄ

Ժամանակ առ ժամանակ ցանկանում եք համոզվել, որ սյունակում մուտքագրված բոլոր արժեքները տարբերվում են միմյանցից: Օրինակ, առաջնային ստեղները ցույց են տալիս սա բավականին հստակ: Եթե ​​աղյուսակ ստեղծելիս դաշտի վրա տեղադրեք ՈՒՆԻԿ սյունակի սահմանափակում, տվյալների բազան կհրաժարվի այդ դաշտում տողերից մեկի համար արժեք մուտքագրելու ցանկացած փորձ, որն արդեն առկա է մեկ այլ տողում: Այս սահմանափակումը կարող է կիրառվել միայն այն դաշտերի վրա, որոնք հայտարարված են որպես NOT NULL, քանի որ անիմաստ է թույլ տալ աղյուսակի մեկ տող ունենալ NULL արժեք, իսկ հետո բացառել NULL արժեքներով մյուս տողերը որպես կրկնօրինակներ: Մեր Վաճառողների աղյուսակի ստեղծման հրամանի հետագա բարելավում կա. CREATE TABLE Salespeople (Snum integer NOT NULL UNIQUE, Sname char (10) NOT NULL UNIQUE, city char (10), comm տասնորդական); Երբ դուք հայտարարում եք, որ անվան դաշտը եզակի է, համոզվեք, որ երկու Մերի Սմիթները մուտքագրված են տարբեր ձևերով, օրինակ՝ Մերի Սմիթ և Մ. Սմիթ: Միևնույն ժամանակ, դա այնքան էլ անհրաժեշտ չէ ֆունկցիոնալ տեսանկյունից, քանի որ snum դաշտը որպես հիմնական բանալի դեռևս կապահովի, որ երկու տողերը տարբեր լինեն, ինչը ավելի հեշտ է աղյուսակներում տվյալներ օգտագործող մարդկանց համար, քան հիշելը, որ այս Smith-ները ոչ նույնական: Սյունակները (ոչ հիմնական բանալիները), որոնց արժեքները պահանջում են եզակիություն, կոչվում են թեկնածու կամ եզակի բանալիներ:

ՅՈՒՐԱՔԱՆԱԿՈՒԹՅՈՒՆԸ ՈՐՊԵՍ ՍԵՂԱՆԱԿԻ ՍԱՀՄԱՆԱՓԱԿՈՒՄ

Դուք կարող եք նաև դաշտերի խումբ սահմանել որպես եզակի՝ օգտագործելով աղյուսակի սահմանափակման հրամանը՝ ՅՈՒՐԱՔԱՆԱԿԱՆ: Դաշտերի խմբի եզակի հայտարարելը տարբերվում է առանձին դաշտերը եզակի հայտարարելուց, քանի որ դա արժեքների համակցություն է, և ոչ միայն անհատական ​​արժեք, որը պետք է եզակի լինի: Խմբի եզակիությունը կարգի ներկայացում է, այնպես, որ «a», «b» և «b», «a» սյունակների արժեքներով զույգերը դիտարկվում են միմյանցից առանձին: Մեր տվյալների բազան նախագծված է այնպես, որ յուրաքանչյուր հաճախորդ նշանակվի մեկ և միայն մեկ վաճառողի: Սա նշանակում է, որ հաճախորդի համարի (cnum) և վաճառողի համարի (snum) յուրաքանչյուր համակցություն Հաճախորդի աղյուսակում պետք է լինի եզակի: Դուք կարող եք դա հաստատել՝ ստեղծելով Հաճախորդների աղյուսակ հետևյալ կերպ. ՍՏԵՂԾԵԼ ՍԵՂԱՆԱԿ Հաճախորդներ (cnum ամբողջ թիվ NOT NULL, cname char (10) NOT NULL, քաղաքի char (10), գնահատական ​​ամբողջ թիվ, snum ամբողջ թիվ NOT NULL, ՅՈՒՐԱՔԱԿԱՆ (cnum, snum): )); Նկատի ունեցեք, որ UNIQUE աղյուսակի երկու սեռերն էլ դեռ օգտագործում են NOT NULL սյունակի սահմանափակումը: Եթե ​​մենք օգտագործեինք UNIQUE սյունակի սահմանափակում cnum դաշտում, ապա աղյուսակի նման սահմանափակում անհրաժեշտ չէր լինի: Եթե ​​cnum դաշտի արժեքները տարբեր են յուրաքանչյուր տողի համար, ապա չի կարող լինել երկու տող՝ cnum և snum դաշտերի արժեքների նույնական համադրությամբ: Նույնը տեղի է ունենում, եթե մենք հայտարարենք snum դաշտը եզակի, թեև դա չի համընկնի մեր օրինակի հետ, քանի որ վաճառողը նշանակվելու է բազմաթիվ հաճախորդների: Հետևաբար, աղյուսակի սահմանափակումը ԵԶԻԱԿԱՆ է, առավել օգտակար, երբ դուք չեք ցանկանում ստիպել առանձին սեռերին եզակի լինել:

Ասենք, օրինակ, որ մենք մշակել ենք աղյուսակ՝ յուրաքանչյուր վաճառողի համար ամեն օր հետևելու բոլոր պատվերներին: Նման աղյուսակի յուրաքանչյուր տող ներկայացնում է ցանկացած կարգի թվերի գումարը, և ոչ միայն անհատական ​​կարգը: Այս դեպքում մենք կարող էինք վերացնել որոշները հնարավոր սխալներհամոզվելով, որ տվյալ վաճառողի համար յուրաքանչյուր օրվա համար մեկից ավելի տող չկա, կամ snum և odate դաշտերի յուրաքանչյուր համակցություն եզակի է: Ահա, թե ինչպես, օրինակ, մենք կարող ենք ստեղծել Salestotal անունով աղյուսակ. CREATE TABLE Salestotal (cnum integer NOT NULL, odate date NULL, totamt տասնորդական, UNIQUE (snum, odate)); Կա նաև հրաման, որը դուք կօգտագործեք ընթացիկ տվյալները այս աղյուսակում տեղադրելու համար. INSERT INTO Salestotal SELECT snum, odate, SUM (amt) FROM Orders GROUP BY snum, odate;

ԱՌԱՋՆԱԿԱՆ ՀԻՄՆԱԿԱՆ ՍԱՀՄԱՆԱՓԱԿՈՒՄՆԵՐ

Մինչ այս մենք առաջնային բանալիները համարում էինք բացառապես որպես տրամաբանական հասկացություններ: Թեև մենք գիտենք, թե ինչ է առաջնային բանալին և ինչպես այն պետք է օգտագործվի ցանկացած աղյուսակում, մենք չգիտենք, թե արդյոք SQL-ն «գիտի» դրա մասին: Հետևաբար, մենք օգտագործեցինք եզակի սահմանափակում կամ եզակի ինդեքսներ առաջնային բանալիների վրա՝ դրանց եզակիությունը պարտադրելու համար: Ավելի վաղ տարբերակներում SQL լեզու, դա անհրաժեշտ էր և կարելի էր այսպես անել։ Այնուամենայնիվ, SQL-ն այժմ աջակցում է հիմնական բանալիներին ուղղակիորեն PRIMARE KEY սահմանափակումով: Այս սահմանափակումը կարող է հասանելի լինել կամ չլինել ձեր համակարգում:

PRIMARY KEY-ը կարող է սահմանափակել աղյուսակները կամ դրանց սյունակները: Այս սահմանափակումն աշխատում է նույնը, ինչ եզակի սահմանափակումը, բացառությամբ, որ միայն մեկ հիմնական բանալի (ցանկացած թվով սյունակների համար) կարող է սահմանվել տվյալ աղյուսակի համար։ Տարբերություն կա նաև առաջնային բանալիների և սյունակի եզակիության միջև՝ արտաքին բանալիների հետ դրանք օգտագործելու ձևով, որը կքննարկվի 19-րդ գլխում: Նրանց եզակիության շարահյուսությունը և սահմանումը նույնն են, ինչ եզակի սահմանափակումների համար:

Հիմնական բանալիները չեն կարող թույլատրել զրոյական արժեքներ: Սա նշանակում է, որ UNIQUE սահմանափակումների դաշտերի նման, PRIMARY KEY սահմանափակման մեջ օգտագործվող ցանկացած դաշտ արդեն պետք է հայտարարվի NOT NULL: Մեր Վաճառողների աղյուսակը ստեղծելու բարելավված տարբերակ կա. ՍՏԵՂԾԵԼ ԱՂՅՈՒՍԱԿ Salestotal (snum integer NOT NULL PRIMARY KEY, sname char(10) NOT NULL UNIQUE, city char(10), comm տասնորդական); Ինչպես տեսնում եք, դաշտերի եզակիությունը (UNIQUE) կարող է հայտարարվել նույն աղյուսակի համար: Լավագույնն այն է, որ PRIMARY KEY սահմանափակումը տեղադրեք դաշտի (կամ դաշտերի) վրա, որը կձևավորի ձեր եզակի տողի նույնացուցիչը, և պահպանեք ՈՒՆԻԿ սահմանափակումը այն դաշտերի վրա, որոնք պետք է լինեն տրամաբանորեն եզակի (օրինակ՝ հեռախոսահամարները կամ անվան դաշտը), այլ ոչ թե բացահայտել տողերը.

ՀԻՄՆԱԿԱՆ ԲԱՆԱԼՆԵՐ ՄԵԿ ՔԱՆ ԱՎԵԼԻ ԴԱՇՏԻ ՀԱՄԱՐ

PRIMARY KEY սահմանափակումը կարող է կիրառվել նաև բազմաթիվ դաշտերի վրա, որոնք ունեն արժեքների եզակի համակցություն: Ենթադրենք, ձեր հիմնական բանալին im է, և դուք ունեք առաջին im և վերջին im-ը պահված երկու տարբեր դաշտերում (այնպես որ կարող եք կազմակերպել տվյալները՝ օգտագործելով որևէ մեկը): Ակնհայտ է, որ ոչ առաջինին, ոչ վերջինին չի կարելի ստիպել ինքնուրույն լինել եզակի, բայց մենք կարող ենք այս երկու համակցություններից յուրաքանչյուրը եզակի դարձնել: Մենք կարող ենք կիրառել PRIMARY KEY աղյուսակի սահմանափակումը զույգերի վրա. CREATE TABLE Namefield (անունը char (10) NOT NULL, ազգանունը char (10) NOT NULL քաղաքի char (10), PRIMARY KEY (անուն, ազգանուն)); Այս մոտեցման խնդիրն այն է, որ մենք կարող ենք ստիպել, որ եզակիությունը հայտնվի, օրինակ՝ ներկայացնելով Մերի Սմիթին և Մ. Սմիթին: Սա կարող է շփոթեցնող լինել, քանի որ ձեր աշխատակիցները կարող են չգիտեն, թե որն է: Սովորաբար ավելի շատ հուսալի միջոցԹվային դաշտը սահմանելու համար, որը կարող է տարբերակել մի տողը մյուսից, այն պետք է ունենա առաջնային բանալի և կիրառի ԵԶԻԱԿԱՆ սահմանափակում երկու դաշտերի անունների վրա:

ԴԱՇՏԻ ԱՐԺԵՔՆԵՐԻ ՍՏՈՒԳՈՒՄ

Իհարկե, կան մի շարք սահմանափակումներ, որոնք դուք կարող եք սահմանել ձեր աղյուսակներում մուտքագրված տվյալների վրա, որպեսզի տեսնեք, օրինակ, արդյոք տվյալները համապատասխան տիրույթում են, թե ճիշտ ձևաչափ, ինչը SQL-ը բնականաբար չի կարող նախապես իմանալ: Այս պատճառով, SQL-ը ձեզ տրամադրում է CHECK սահմանափակում, որը թույլ է տալիս Ձեզ սահմանել պայման, որը պետք է բավարարի աղյուսակում մուտքագրված արժեքը՝ նախքան այն ընդունելը: CHECK սահմանափակումը բաղկացած է CHECK բանալի բառից, որին հաջորդում է նախադրյալ դրույթը, որն օգտագործում է նշված դաշտը: Ցանկացած փորձ՝ փոփոխելու կամ զետեղելու գենդերային արժեք, որը կդարձներ այս պրեդիկատը անվավեր, կմերժվի:

Եկեք նորից նայենք Վաճառողների աղյուսակին: Հանձնաժողովի սյունակը արտահայտված է տասնորդականև, հետևաբար, կարող է ուղղակիորեն բազմապատկվել գնումների քանակով, որի արդյունքում ստացվում է վաճառողի միջնորդավճարի չափը (դոլարով) աջ կողմում դրված դոլարի նշանով ($): Ինչ-որ մեկը կարող է օգտագործել տոկոս հասկացությունը, բայց դուք նույնիսկ չգիտեք դրա մասին: Եթե ​​անձը սխալմամբ մուտքագրում է 14-ը .14-ի փոխարեն՝ նշելու իր միջնորդավճարի տոկոսը, այն կմեկնաբանվի որպես 14.0, որը օրինական տասնորդական արժեք է, և սովորաբար կընդունվի համակարգի կողմից: Այս սխալը կանխելու համար մենք կարող ենք սահմանել սյունակի սահմանափակում՝ CHECK՝ համոզվելու համար, որ մուտքագրված արժեքը 1-ից փոքր է: CREATE TABLE Վաճառողներ (snum integer NOT NULL PRIMARY KEY, sname char (10) NOT NULL UNIQUE, city char (10), comm տասնորդական ստուգում (comm< 1));

ՕԳՏԱԳՈՐԾԵԼՈՎ -ՍՏՈՒԳՈՒՄԸ ՎԱՎԵՐ ՄՈՒՏՔԻ ԱՐԺԵՔԸ ՆԱԽԱՍԱՀՄԱՆԵԼՈՒ ՀԱՄԱՐ

Մենք կարող ենք նաև օգտագործել CHECK սահմանափակում՝ կանխելու որոշակի արժեքների մուտքագրումը դաշտ՝ այդպիսով կանխելով սխալը: Օրինակ, ենթադրենք, որ միակ քաղաքները, որտեղ մենք ունեինք վաճառքի գրասենյակներ, եղել են Լոնդոնը, Բարսելոնան, Սան Խոսեն և Նյու Յորքը։ Եթե ​​գիտեք այս բաժիններից յուրաքանչյուրում աշխատող բոլոր վաճառողներին, կարիք չկա թույլ տալ այլ արժեքներ մուտքագրել: Եթե ​​ոչ, ապա սահմանափակումների օգտագործումը կարող է կանխել տառասխալները և այլ սխալները: ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿ վաճառողներ (snum integer NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, քաղաքի char(10) CHECK, (քաղաք IN («Լոնդոն», «Նյու Յորք», «Սան Խոսե», «Բարսելոնա»)), comm տասնորդական ստուգում (comm< 1)); Конечно, если вы собираетесь сделать это, вы должны быть уверены что ваша компания не открыла уже новых других ведомств сбыта. Большинство программ баз данных поддерживают команду ALTER TABLE(см. Главу 17) которая позволяет вам изменять определение таблицы, даже когда она находится в использовании. Однако, изменение или удаление ограничений не всегда возможно для этих команд, даже там где это вроде бы поддерживается. Если вы использовали систему которая не может удалять ограничения, вы будете должны создавать (CREATE) նոր սեղանև փոխանցեք տեղեկատվությունը հին աղյուսակից, երբ ցանկանում եք փոխել սահմանափակումը: Իհարկե, դուք չեք ցանկանա դա հաճախ անել, և ժամանակի ընթացքում ընդհանրապես կդադարեցնեք դա անել։

Եկեք ստեղծենք Պատվերների աղյուսակ. CREATE TABLE Orders (onum integer NOT NULL UNIQUE, amt տասնորդական, odate date NOT NULL, cnum integer NOT NULL, snum integer NOT NULL); Ինչպես մենք քննարկեցինք 2-րդ գլխում, DATE տեսակը լայնորեն աջակցվում է, բայց ANSI ստանդարտի մաս չէ: Ի՞նչ պետք է անենք, եթե օգտագործում ենք տվյալների բազա, որը հետևում է ANSI-ին և չի ճանաչում DATE տեսակը: Եթե ​​մենք հայտարարում ենք, որ odate դաշտը ցանկացած տեսակի թիվ է, մենք չենք կարող օգտագործել հետին կտրվածք (/) կամ գծիկ (-) որպես բաժանարար: Քանի որ տպվող թվերը ASCII նիշեր են, մենք կարող ենք ամսաթվի դաշտի տեսակը հայտարարել CHAR: Հիմնական խնդիրն այն է, որ մենք ստիպված կլինենք օգտագործել միայնակ չակերտներ, երբ մենք դիմում ենք հարցման մեջ odate դաշտի արժեքին: Ոչ ավելին պարզ լուծումԱյս խնդիրն այն է, որտեղ DATE տեսակն այդքան տարածված է դարձել: Պատկերացնելու համար եկեք odate դաշտը հայտարարենք որպես CHAR տեսակ: Մենք կարող ենք գոնե մեր ձևաչափը պարտադրել CHECK սահմանափակումով. CREATE TABLE Orders (onum integer NOT NULL UNIQUE, amt տասնորդական, odate char (10) NOT NULL CHECK (ամսաթիվը LIKE "--/--/--- -" ), cnum NOT NULL, snum NOT NULL); Բացի այդ, եթե ցանկանում եք, կարող եք սահմանափակում դնել՝ համոզվելու համար, որ մուտքագրված նիշերը թվեր են, և դրանք գտնվում են մեր տիրույթի արժեքների մեջ:

ՎԻՃԱԿԻ ՍՏՈՒԳՈՒՄ ԲԱԶՄԱԿԱՆ ԴԱՇՏԵՐԻ ՀԻՄՆԱՑՈՂ

Կարող եք նաև օգտագործել CHECK-ը որպես աղյուսակի սահմանափակում: Սա օգտակար է այն դեպքերում, երբ ցանկանում եք մեկից ավելի տող ներառել պայմանում: Ենթադրենք, որ 0,15 և ավելի բարձր միջնորդավճարները կթույլատրվեն միայն Բարսելոնայից վաճառողին: Դուք կարող եք դա սահմանել հետևյալ CHECK աղյուսակի սահմանափակումով. CREATE TABLE Salespeople (snum integer NOT NULL UNIQUE, sname char (10) NOT NULL UNIQUE, city char (10), comm տասնորդական, CHECK (comm):< .15 OR city = "Barcelona")); Как вы можете видеть, два различных пол должны быть проверены чтобы определить, верен предикат или нет. Имейте в виду, что это - два разных пол одной и той же строки. Хотя вы можете использовать многочисленные поля, SQL не может проверить более одной строки одновременно. Вы не можете например использовать ограничение CHECK чтобы удостовериться что все комиссионные в данном городе одинаковы. Чтобы сделать это, SQL должен всякий раз просматривая другие строки таблицы, когда вы модифицируете или вставляете строку, видеть, что значение комиссионных указано для текущего города. SQL этого делать не умеет.

Փաստորեն, դուք կարող եք օգտագործել CHECK-ի բարդ սահմանաչափը վերը նշվածի համար, եթե նախապես իմանայիք, թե որքան պետք է լինեն վճարները տարբեր քաղաքներում: Օրինակ, դուք կարող եք սահմանել այսպիսի սահմանափակում. CHECK ((comm = .15 AND clty = «London») ԿԱՄ (comm = .14 AND city = «Բարսելոնա») ԿԱՄ (comm = 11 AND city = «San Jose»): ) ..) Դուք հասկացաք: Նման մի շարք սահմանափակումներ դնելու փոխարեն դուք կարող եք պարզապես օգտագործել դիտում WITH CHECK OPTION կետով, որն ունի այս բոլոր պայմաններն իր պրեդիկատում (տես Գլուխ 20-ը և՛ դիտման, և՛ WITH CHECK OPTION-ի համար): Օգտագործողները կարող են մուտք գործել աղյուսակի տեսք՝ աղյուսակի փոխարեն: Դրա առավելություններից մեկն այն կլինի, որ սահմանափակումը փոխելու ընթացակարգը չի լինի այնքան ցավոտ կամ ժամանակատար: WITH CHECK OPTION տեսքը լավ փոխարինում է CHECK սահմանափակումին, ինչպես կցուցադրվի 21-րդ գլխում:

ԿԱՐԳԱՎՈՐՎԱԾ ԱՐԺԵՔՆԵՐԻ ՍԱՀՄԱՆՈՒՄ

Երբ դուք տող եք տեղադրում աղյուսակում՝ առանց դրա մեջ արժեքներ նշելու յուրաքանչյուր դաշտի համար, SQL-ը պետք է ունենա լռելյայն արժեք՝ այն կոնկրետ դաշտում ներառելու համար, հակառակ դեպքում հրամանը կմերժվի: Ամենատարածված լռելյայն արժեքը NULL-ն է: Սա լռելյայն արժեք է ցանկացած սյունակի համար, որին տրված չէ NOT NULL սահմանափակում կամ ունեցել է մեկ այլ լռելյայն հանձնարարություն:

DEFAULT արժեքը նշված է CREATE TABLE հրամանում այնպես, ինչպես սյունակի սահմանափակումը, չնայած, տեխնիկապես ասած, DEFAULT արժեքը սահմանափակող հատկություն չէ. այն չի սահմանափակում այն ​​արժեքները, որոնք կարող եք մուտքագրել, այլ պարզապես որոշում է, թե ինչ կարող է լինել: տեղի կունենա, եթե չմտնեք դրանցից որևէ մեկը: Ենթադրենք, դուք աշխատում եք Նյու Յորքի գրասենյակում, և ձեր վաճառողների ճնշող մեծամասնությունը ապրում է Նյու Յորքում: Դուք կարող եք նշել Նյու Յորքը որպես քաղաքի լռելյայն գենդերային արժեք ձեր Վաճառողների աղյուսակի համար. ՍՏԵՂԾԵԼ ԱՂՅՈՒՍԱԿ Վաճառողներ (snum integer NOT NULL UNIQUE, sname char(10) NOT NULL UNIQUE, քաղաքի char(10) DEFAULT = «New York», comm տասնորդական ՍՏՈՒԳՈՒՄ (comm< 1); Конечно, вводить значение Нью Йорк в таблицу каждый раз когда назначается новый продавец, не такая уж необходимость, и можно просто пренебречь им (не ввод его) даже если оно должно иметь некоторое значение. Значение по умолчанию такого типа, более предпочтительно, чем, например, длинный конторский номер указывающий на ваше собственное ведомство, в таблице Порядков. Длинные числовые значения - более расположены к ошибке, поэтому если подавляющее большинство (или все) ваших порядков должны иметь ваш собственный конторский номер, желательно устанавливать для них значение по умолчанию.

Լռելյայն արժեք օգտագործելու մեկ այլ եղանակ է այն օգտագործել որպես NULL-ի այլընտրանք: Քանի որ NULL-ը (իրականում) կեղծ է IS NULL-ից բացի այլ համեմատության դեպքում, այն կարելի է վերացնել՝ օգտագործելով պրեդիկատների մեծ մասը: Երբեմն, դուք պետք է տեսնեք ձեր դաշտերի դատարկ արժեքները՝ առանց դրանք որևէ հատուկ ձևով մշակելու: Դուք կարող եք սահմանել լռելյայն արժեք, օրինակ՝ զրո կամ բացատ, որն իր արժեքով ավելի փոքր է, քան չսահմանված արժեքը՝ NULL: Նրանց և սովորական NULL-ի միջև տարբերությունն այն է, որ SQL-ը կվերաբերվի նրանց այնպես, ինչպես ցանկացած այլ արժեք:

Ենթադրենք, որ հաճախորդներին ի սկզբանե չեն հանձնարարվել գնահատականներ: Վեց ամիսը մեկ դուք բարձրացնում եք ձեր բոլոր հաճախորդների վարկանիշը, ովքեր ունեն միջինից ցածր վարկանիշ, ներառյալ նրանց, ովքեր նախկինում որևէ վարկանիշային հանձնարարություն չեն ունեցել: Եթե ​​ցանկանում եք ընտրել այս բոլոր հաճախորդներին որպես խումբ, հետևյալ հարցումը կբացառի բոլոր հաճախորդներին վարկանիշ ունեցող = NULL. SELECT * FROM Customers WHERE վարկանիշը< = 100; Однако, если вы назначили значение по умолчанию = 000, в поле rating, заказчики без оценок будут выбраны наряду с другими. Приоритет каждого метода - зависит от ситуации. Если вы будете делать запрос с помощью пол оценки, то захотите ли Вы включить строки без значений, или исключите их? Друга характеристика значений по умолчанию этого типа, позволит объявить Вам поле оценки - как NOT NULL. Если вы используете его по умолчанию, чтобы избежать значений = NULL, то это - вероятно хороша защита от ошибок.

Այս դաշտում կարող եք նաև օգտագործել ՈՒՆԻԿ կամ ՀԻՄՆԱԿԱՆ ԲԱՆԱԼԻ սահմանափակումները: Եթե ​​դուք դա անում եք, նշանակում է, որ միայն մեկ տող կարող է ունենալ լռելյայն արժեք: Լռելյայն արժեք պարունակող ցանկացած տող պետք է փոփոխվի, նախքան լռելյայն արժեքով մեկ այլ տող տեղադրվի: Սովորաբար սա այն չէ, թե ինչպես եք օգտագործում լռելյայն արժեքները, հետևաբար, ՈՒՆԻԿ և ՀԻՄՆԱԿԱՆ ԲԱՆԱԼԻ սահմանափակումները (հատկապես վերջիններս) սովորաբար չեն դրվում լռելյայն արժեքներով տողերի վրա:

ԱՄՓՈՓՈՒՄ

Այժմ դուք ունեք մի քանի եղանակ՝ վերահսկելու այն արժեքները, որոնք կարող են մուտքագրվել ձեր աղյուսակներում: Դուք կարող եք օգտագործել NOT NULL սահմանափակում՝ NULL-ները բացառելու համար, եզակի սահմանափակում՝ մեկ կամ մի քանի սյունակների խմբի բոլոր արժեքներին ստիպելու համար, որ բոլոր արժեքները տարբերվեն միմյանցից, PRIMARY KEY սահմանափակում, որը հիմնականում անելու է նույն բանը, ինչ UNIQUE-ը, բայց տարբեր ավարտ և վերջապես CHECK սահմանափակում՝ սահմանելու ձեր սեփական սովորական պայմանները, որպեսզի դրանցից առաջ հանդիպած արժեքները մուտքագրվեն: Որպես այլընտրանք, դուք կարող եք օգտագործել DEFAULT դրույթը, որն ավտոմատ կերպով լռելյայն արժեք կտեղադրի ցանկացած դաշտում, որի անունը նշված չէ INSERT-ում, ճիշտ այնպես, ինչպես NULL արժեքը տեղադրվում է, երբ DEFAULT կետը սահմանված չէ և չկա NOT NULL սահմանափակում: ԱՐՏԱՔԻՆ ԲԱՆԱԼԻ կամ Հղումների սահմանափակումները, որոնց մասին դուք կսովորեք 19-րդ գլխում, շատ նման են դրանց, բացառությամբ, որ դրանք կապում են մեկ կամ մի քանի դաշտերի խումբ մեկ այլ խմբի հետ և այդպիսով անմիջապես ազդում են արժեքների վրա, որոնք կարող են մուտքագրվել: այդ խմբերից որևէ մեկը..

ԱՇԽԱՏԱՆՔ SQL-ի հետ

1. Ստեղծեք Order աղյուսակ, որպեսզի onum դաշտի բոլոր արժեքները, ինչպես նաև cnum և snum դաշտերի բոլոր համակցությունները տարբերվեն միմյանցից, և որպեսզի NULL արժեքները բացառվեն ամսաթվի դաշտից:

2. Ստեղծեք վաճառքի աղյուսակ, որպեսզի կանխադրված միջնորդավճարը լինի 10%, թույլ չտա NULL արժեքներ, որպեսզի snum դաշտը լինի առաջնային բանալին, և որպեսզի բոլոր անունները լինեն այբբենական կարգով A-ի և M-ի միջև ներառյալ (նկատի ունենալով, որ բոլոր անունները կտպվեն մեծատառերով):

3. Ստեղծեք Order աղյուսակ՝ համոզված լինելով, որ onum դաշտը մեծ է cnum դաշտից, իսկ cnum-ը մեծ է snum-ից: NULL արժեքները չեն թույլատրվում այս երեք դաշտերից որևէ մեկում:

ՅՈՒՐԱՔԱՆԱԿԱՆ սահմանափակումը եզակի կերպով նույնականացնում է տվյալների բազայի աղյուսակի յուրաքանչյուր գրառում:

Եզակի և PRIMARY KEY սահմանափակման սյունակը կամ սյունակների հավաքածուն եզակի երաշխիք է տալիս:

ԱՌԱՋՆՈՐԴ ԲԱՆԱԼԻ սահմանափակումը ավտոմատ կերպով ունի եզակիության սահմանափակում:

Նկատի ունեցեք, որ յուրաքանչյուր աղյուսակ կարող է ունենալ մի քանի եզակի սահմանափակումներ, բայց յուրաքանչյուր աղյուսակ կարող է ունենալ միայն մեկ հիմնական բանալի սահմանափակում:

CREATE TABLE SQL եզակի սահմանափակում, երբ

Հետևյալ SQL-ը, երբ ստեղծվեց «Persons» աղյուսակը, «p_id» սյունակի վրա եզակի սահմանափակում ստեղծելու համար.

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵՔ Անձինք
P_Id int NOT NULL,

Անուն varchar(255),
Հասցե varchar(255),
Քաղաք Վարճար(255),
ՅՈՒՐԱՔԱՆԱԿԱՆ (P_Id)
)

SQL Server / Oracle / MS Access.

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵՔ Անձինք
P_Id int NOT NULL ՅՈՒՐԱՔԱԿԱՆ,
Ազգանուն varchar(255) NOT NULL,
Անուն varchar(255),
Հասցե varchar(255),
Քաղաք Վարճար(255)
)

Եզակի սահմանափակումներ ՈՒՆԻԿ սահմանափակումներ անվանելու և բազմաթիվ սյունակներ սահմանելու համար օգտագործեք հետևյալ SQL շարահյուսությունը.

ՍԵՂԱՆԱԿ ՍՏԵՂԾԵՔ Անձինք
P_Id int NOT NULL,
Ազգանուն varchar(255) NOT NULL,
Անուն varchar(255),
Հասցե varchar(255),
Քաղաք Վարճար(255),
CONSTRAINT uc_PersonID ՅՈՒՐԱՔԱՆԱԿԱՆ (P_Id, ազգանուն)
)

SQL եզակի սահմանափակում ՓՈՓՈԽԵԼ ԱՂՅՈՒՍԱԿԸ երբ

Երբ աղյուսակը ստեղծվի, ստեղծեք եզակի սահմանափակում «p_id» սյունակի վրա, խնդրում ենք օգտագործել հետևյալ SQL-ը.

MySQL / SQL Server / Oracle / MS Access.

ALTER TABLE Անձեր
ԱՎԵԼԱՑՆԵԼ ՅՈՒՐԱՔԱՆԱԿԱՆ (P_Id)

Եզակի սահմանափակումներ ՈՒՆԻԿ սահմանափակումներ անվանելու և բազմաթիվ սյունակներ սահմանելու համար օգտագործեք հետևյալ SQL շարահյուսությունը:

Եզակի սահմանափակումը խոչընդոտում է երկու գրառումների ստեղծմանը, որոնք ունեն նույն արժեքը սյունակում: ՀԱՃԱԽՈՐԴՆԵՐ աղյուսակում, օրինակ, կարող եք ստեղծել նույն տարիքի երկու կամ ավելի մարդկանց:

Օրինակ

Օրինակ, հետևյալ SQL հարցումը ստեղծում է նոր աղյուսակ CUSTOMERS անունով և ավելացնում հինգ սյունակ: Այստեղ AGE սյունակը դրված է UNIQUE, այնպես որ դուք չեք կարող ունենալ նույն տարիքի երկու գրառում:

ՍՏԵՂԾԵԼ ՍԵՂԱՆԱԿԻ ՀԱՃԱԽՈՐԴՆԵՐ (ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL ՅՈՒՐԱՔԱԿԱՆ, ՀԱՍՑԵԻ ՆՇԱՆԱԿԸ (25) , ԱՇԽԱՏԱՎԱՐՁ ՏԱՍՆԱԿԱՆ (18, 2), ԱՌԱՋՆԱԿԱՆ ԲԱՆԱԼ (ID));

Եթե ​​CUSTOMERS աղյուսակն արդեն ստեղծված է, ապա եթե ցանկանում եք AGE սյունակում եզակի սահմանափակում ավելացնել, ապա պետք է գրեք այնպիսի հայտարարություն, ինչպիսին է հարցումը, որը նշված է ստորև նշված կոդի բլոկում:

ՓՈՓՈԽՈՒՄ ԵՆ ՍԵՂԱՆԻ ՀԱՃԱԽՈՐԴՆԵՐԸ ՓՈՓՈԽՈՒՄ ԵՆ ՏԱՐԻՔԸ ՈՉ ԶՐՈՒՅԱԿ, եզակի;

Կարող եք նաև օգտագործել հետևյալ շարահյուսությունը, որն աջակցում է բազմաթիվ սյունակների անվանման սահմանափակումներին:

ՓՈՓՈԽԵԼ ՍԵՂԱՆԻ ՀԱՃԱԽՈՐԴՆԵՐԸ ԱՎԵԼԱՑՆԵԼ ՍԱՀՄԱՆԱՓԱԿՈՒՄ myUniqueConstraint ՅՈՒՐԱՔԱՆԱԿԱՆ (ՏԱՐԻՔ, ԱՇԽԱՏԱՎԱՐՁ);

ՅՈՒՐԱՔԱԿԱՆ սահմանափակման հեռացում

UNIQUE սահմանափակումը հեռացնելու համար օգտագործեք հետևյալ SQL հարցումը.