Professional Documents
Culture Documents
Лабораториски Бази 3
Лабораториски Бази 3
Лабораториски Бази 3
вредностите на
податоците
Лабораториска вежба 3
Содржина
► Ограничување на вредностите на податоците
► Додавање и бришење на ограничувања
► Искористување на колоната IDENTITY
► Ограничување PRIMАRY KEY
► Ограничување UNIQUE
► Ограничување FOREIGN KEY
► Ограничување за валидност на податоците
Ограничување CHECK
Ограничување DEFAULT
► Глобални уникални идентификатори
► Задача
Ограничување на вредностите на податоците
► SQL server подржува два начина за реализирање на целоста на
податоците – процедурен и декларативен.
► Процедурниот се извршува преку тригери, зачувани процедури,
вредности по подразбирање (defaults) правила и т.н. Овој начин
е подобар но при изполнението се можно појава на грешки.
► Декларативниот начин е со помош на ограничувањата кој
преставува начин за управување на податоците со раширен SQL
код, кој се користи при создавање и промена на табелите.
► Системните процедури exec sp_helpconstraint ‘MyTable’ и exec
sp_help ‘MyTable’ ни дават информации за ограничувањата
во табелите.
► Имињата на ограничувањата треба да се уникатни.
► Конструкциите CREATE TABLE и ALTER TABLE во Transact-
SQL ни даваат повеќе возможности за додавање, бришење
на ограничувања за разлика од графичкиот интерфејс.
Додавање и бришење на ограничувања
► Ограничувањата се декларират на ниво колона или на
ниво табела. Ограничувањата кој користат повеќе од
една колона, се декларират на ниво табела.
Дефинирање на ограничувања при создавање на
табела:
Пример:
Пример:
ALTER TABLE MyDatabases..Employees
DROP CONSTRAINT unique_MB
Искористување на колоната IDENTITY
► ЕднаIDENTITY колона е специјална колона вo
табелата, автоматски се пополнува, и се
генерира секој пат, кога се додава нов запис во
табелата. Треба да се има во предвид следното
при користење на колона IDENTITY:
може да има најмногу една колона IDENTITY во една
табела;
колоната треба да користи целоброен тип
податоци(int, smallint, tinyint) или точен броен тип
податоци (numeric, decimal) без децимални делови,
т.е. колоната треба да содржи само цели броеви;
колоната автоматски добива опција NOT NULL;
колоната не може да се актуализира.
► Создавање на IDENTITY колона е со конструкцијата CREATE
TABLE или ALTER TABLE на следниот начин:
column_name datatype [null_option]
[IDENTITY [(seed, increment)]]
► Вредностите seed и increment се опции и oпределуват
соодветно првата вредност, која ќе се искористува и стапка
на зголемување за следните вредности во колоната. По
подразбирање се единици.
Пример:
1) Создавање на табела со неколку колони, првата од кои
ID е IDENTITY колона со почетна вредност и стапка 1:
CREATE TABLE IdentityExample1
( ID int IDENTITY NOT NULL,
FirstName varchar(25) NOT NULL,
LastName varchar(25) NOT NULL )
2) Создавање на табела со IDENTITY колона, на која изрично се
дефинирани почетната вредност и стапка:
CREATE TABLE IdentityExample2
( ID int NOT NULL IDENTITY(100, 5),
FirstName varchar(25) NOT NULL,
LastName varchar(25) NOT NULL )
3) Создавање на табела со IDENTITY колона со стапка на негативно
зголемување:
CREATE TABLE IdentityExample3
( ID int NOT NULL IDENTITY(0, -1),
FirstName varchar(25) NOT NULL,
LastName varchar(25) NOT NULL )
Сл.1
Сл.2
Ограничување UNIQUE
► Ограничувањето за уникалност е слично на
ограничувањето примарен клуч, но треба да се
имат во предвит следните разлики:
Колоните, кој се состојат со ограничување за
уникатност, можат да имат вредности NULL.
Во една табела може да има нула, едно или повеќе
ограничувања за уникатност.
► Создавањето на ограничување за уникатност во
конструкцијата CREATE TABLE или ALTER TABLE
го има следниот синтаксис:
[CONSTRAINT unique_name]
UNIQUE [CLUSTERED | NONCLUSTERED]
[(col_name1 [, col_name2 [, …, col_name16]])]
Пример:
1) Создавање на табела Employees со колона MB, во која е
дефинирао ограничување за уникатност:
CREATE TABLE Employees
( EmployeeID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
HireDate datetime NULL,
MB char(10) NULL UNIQUE )
2) Додавање на колона MB, во која е дефинирано
ограничување за уникатност, во веќе создадена табела
Employees:
ALTER TABLE MyDatabase..Employees
ADD MB char(10) NULL
CONSTRAINT unique_mb UNIQUE (MB)
► Ограничувањето UNIQUE може да се зададе, кога се
искористи прозорецот Design на (Сл.1) на Management Studio
со маркирање на колоните, кој сакаме сакаме да се примарни
клучови и потоа притискаме десен клик и од менито
избираме Indexes/Key (Сл.3) потоа се отвора прозор како на
слика 4 каде натискаме Add и во Type избираме Unique Key и
соодветно ги мене и другите параметри.
Сл.3 Сл.4
Ограничување FOREIGN KEY
► Ограничувањето FOREIGN KEY (ограничувањето
надворешен клуч) се користи за подржување на
целоста на врските помеѓу табелите. При користење
на ограничувањето FOREIGN KEY треба да се има во
предвид следното:
Надворешниот клуч треба да се однесува кон
примарниот клуч или ограничувањето за уникатност
во реферираната табела. Надворечниот клуч може да
реферира иста табела (рекурсивна релација) или
друга табела во истата база. За референција кон
табела од друга база се користи тригер.
Бројот на колоните во надворешниот клуч треба да е
ист со бројот на колоните во примарниот клуч (или
ограничувањето за уникалност) во реферираната
табела. Типовете на колоните исто треба да се
еднакви.
Никакви индекси не се создават автоматски над
колоните, кој учествуваат во надворешниот клуч.
► Значењето на ограничувањето надворешен клуч е да контролира податоците,
кој се чуват во реферираштата и реферираната табела. Родителските записи не
можат да бидат избришани, ако постојат подчинени соодветни записи;
родителскиот клуч не може да се променува, ако има соодветни записи во
подчинената табела; не може да се додава запис во подчинената табела, ако
надворешниот клуч не е иста со ниедна примарна вредност.
► Создавањето на надворешен клуч во конструкцијата CREATE TABLE или
ALTER TABLE го има следниот синтаксис:
[CONSTRAINT fk_name]
[FOREIGN KEY (col_name1 [, col_name2 [, …, col_name16]])]
REFERENCES referenced_table_name
(ref_col_name1 [, ref_col_name2 [, …, ref_col_name16]])
1) Создавање на табела EmployeeReview со надворешен клуч, кој ја
референцира табелата Employees.
CREATE TABLE EmployeeReview
( EmployeeID int NOT NULL
REFERENCES Employees(EmployeeID),
ReviewDate datetime NOT NULL,
PerformanceRank tinyint NOT NULL,
Comments text NULL,
CONSTRAINT PK_EmployeeReview
PRIMARY KEY (EmployeeID, ReviewDate) )
2) Овој пример покажува како да се создаде рекурсивна релација. Табелата
Employees има референција кон себе си. На ограничувањето е дадено име
FK_ManagerID.
CREATE TABLE Employees
( EmployeeID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
HireDate datetime NULL,
ManagerID int NULL,
CONSTRAINT FK_ManagerID
FOREIGN KEY (ManagerID)
REFERENCES Employees (EmployeeID) )
3) Додавање на ограничување FOREIGN KEY кон постојна табела.
CREATE TABLE EmployeeReview
( EmployeeID int NOT NULL,
ReviewDate datetime NOT NULL,
PerformanceRank tinyint NOT NULL,
Comments text NULL,
CONSTRAINT PK_EmployeeReview
PRIMARY KEY (EmployeeID, ReviewDate) )
ALTER TABLE EmployeeReview
ADD CONSTRAINT FK_EmployeeReview
FOREIGN KEY (EmployeeID)
REFERENCES Employees (EmployeeID)
► Во SQL Server можат само да се гледат постоечките
ограничувања надворешен клуч од проектниот изглед на табела.
Кога се искористи прозорецот Design на (Сл.1) на Management
Studio. Десен клик на колона Relationships (Сл.4) дава можност за
преглед на ограничувањата надворешен клуч (Сл.5) на избраната
табела потоа Add.
Сл.4 Сл.5
► Друг начин за создавање е прикажан на слика
6, кога ке се рашри дрвото на сите елементи во
базата и на keys десен клик (сл.6), при што се
отвора прозорец (сл.7) од каде менаџираме.
Сл.6
Сл.7
► Друга начин за додавање на надворешен клуч е преку Database Diagrams
(сл.8) по што се отвора прозорец (сл.9) од каде ги избираме табелите по
што ни се покажуват табелите и доколко некоја релација. Десен клик на
некоја табела ни ги дава опциите(сл.10) и со кликање и влечење на некој
колона на некоја табела кон некоја друга ни дава можност да поставиме
клуч (сл.11).
Сл.8 Сл.9
Сл.10
Сл.11
Ограничување за валидност на податоците
► Ова ограничување се користи за одржување на целосна
облас во SQL Server преку осигурување на валидни
вредности. Извршува се на два начина: со проверка на
вредностите на колоните и преку вредностите по
подразбирање кај колоните.
Ограничување CHECK
► Ограничувањето CHECK осигурува начин за SQL Server
да потврдува вредностите во колона (или колони),
когато се додава или променува ред. При искористување
на ограничувањето CHECK треба да се има во предвид
следното:
Правилата за валидност на податоците во ограничувањето
CHECK треба да се логички изрази.
Ограничувањето CHECK може да се однесува кон други колони
во истата табела.
► Создавање на ограничување CHECK во конструкцијата
CREATE TABLE или ALTER TABLE го има следниот
синтаксис:
[CONSTRAINT check_constraint_name]
CHECK (check_expression)
1) Создавање на табела со ограничување CHECK, декларирано на
ниво табела со име valid_manager, според кое никој служител не
може да нема началник, освен служител со идентификатор 1, кој
се предполага, дека е директор.
CREATE TABLE Employees
( EmployeeID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
HireDate datetime NULL,
ManagerID int NULL
CONSTRAINT FK_ManagerID
FOREIGN KEY
REFERENCES Employees (EmployeeID),
CONSTRAINT valid_manager
CHECK (ManagerID IS NOT NULL OR EmployeeID = 1) )
2) Додавање на ограничувањето end_of_month, кое гарантира, дека не може
да се прават промени во табелата после 28 во месецот. Тоа ограничување
никога не се обраќа кон колона од табелата.
ALTER TABLE Employees
ADD CONSTRAINT end_of_month
CHECK (DATEPART(day, GETDATE())<28)
3) Забрана на ограничувањето end_of_month.
ALTER TABLE Employees
NOCHECK CONSTRAINT end_of_month
4) Бришење на ограничувањето end_of_month.
ALTER TABLE Employees
DROP CONSTRAINT end_of_month
► Ограничувањето CHECK може да се додаде и кога се користи
прозореца Design вo SQL Server Management Studio. Check
Constraints (Сл.12) дава можност за дефинирање на
ограничувањето CHECK на избраната табела по што се отвара
прозор како на сликата 13.
Сл.12 Сл.13
Ограничување DEFAULT
► Ограничувањето DEFAULT (ограничување по
подразбирање) се користи, когато се додава нов ред во
табела. Ако колоната има ограничување DEFAULT и
корисникот не дава изрично вредност за колоната,
тогаш се користи вредност од ограничувањето. При
користење на ограничувањето DEFAULT треба да се
има во предвид следното:
Само едно ограничување DEFAULT може да се зададе за
дадена колона.
Тоа ограничување не може да се зададе за колона со својство
IDENTITY или за колона од тип timestamp.
► Создавање на ограничување DEFAULT во
конструкцијата CREATE TABLE или ALTER TABLE го има
следниот синтаксис:
[CONSTRAINT default_constraint_name]
DEFAULT {constant_value | niladic_function | NULL}
[FOR column_name]
► При додавање на колона со ограничување DEFAULT преку
конструкцијата ALTER TABLE може да се искористат
клучовите зборови WITH VALUES, за пополнување на
постоечки редове со соодветна вредност:
ALTER TABLE table_name
ADD column_name datatype [null_option]
[ [CONSTRAINT default_constraint_name]
DEFAULT {constant_value | niladic_function | NULL}
[WITH VALUES] ]
Пример: Нека е создадена по следниот начин табелата:
CREATE TABLE Customers
( CustomerID int NOT NULL IDENTITY
CONSTRAINT PK_customers PRIMARY KEY,
CustomerName varchar(50) NOT NULL,
Address varchar(50) NULL,
City varchar(25) NULL,
PhoneNumber char(15) NULL )
Во неа се воведени редови, по кое е неопходно да се додаде
колона CurrentBalance и да се пополни со вредност 0:
ALTER TABLE Customers
ADD CurrentBalance money NOT NULL
CONSTRAINT DF_CurrentBalance
DEFAULT 0 WITH VALUES
► Ограничувањето DEFAULT може да се додаде и кога се користи
прозорецот Design - Column Properties(Сл.14).
Сл.14
Глобални уникални идентификатори
► Ако една програма треба да генерира идентифицирашта колона,
која е уникатна во рамките на целата база, треба да се користи
својството ROWGUIDCOL, тип податоци uniqueidentifier и функција
NewID(). Својството ROWGUIDCOL на колона од тип uniqueidentifier
се задава, ако таа ќе се користи за идентификатор на ред.
► Пример:
CREATE TABLE Employees
( EmployeeID uniqueidentifier NOT NULL ROWGUIDCOL
DEFAULT NewID(),
FirstName varchar(25) NOT NULL,
LastName varchar(25) NOT NULL )
► За да се додаде или избрише својство ROWGUIDCOL за постоечка
колона од тип uniqueidentifier, се користи конструкција ALTER
TABLE по следниот начин:
ALTER TABLE table_name
ALTER COLUMN column_name {ADD | DROP} ROWGUIDCOL
Пример:
CREATE TABLE Employees
( EmployeeID uniqueidentifier NOT NULL DEFAULT NewID(),
FirstName varchar(25) NOT NULL,
LastName varchar(25) NOT NULL )
ALTER TABLE Employees
ALTER COLUMN EmployeeID ADD ROWGUIDCOL
► Задача 1. Да се создаде база, која да чува информација, неопходна на
една фирма за продажба на определени продукти, за да може по-лесно и
по-ефикасно да се управува залихите и да се следат продажбите. За секој
продукт се чува информација за наименовањето му; вид (категорија);
доставувач; доставна цена; залихи количество; дали продажбата на тој
продукт е прекината или не; количество, което се отчитува за критично за
соодветен продукт (т.е. Покажува неопходност од нова доставка). За
продавниците на фирмата се чува информација за име; адрес; град;
телефонски број; факс; e-mail; Web адрес. За служителите се подржува
информација за имиња; должност; ЕГН; продавниците, во кој работи;
дата на влез; дата на излез; телефонски број; адреса; град; e-mail. За
доставувачите на стоки се чува информација за името на фирмата-
доставувач; име за контакт; должност на служителот, чието име е
зачувано; адрес; телефонски број; факс; e-mail; Web адрес. За клиентите
се поддържа информация за име на фирмата-клиент; име за контакт;
должност; адреса; телефонски број; факс; e-mail; Web адрес; Bulstat;
даночен број(за да е можно издавање на фактури). За продажбите се
подржува информација за клиент; служител; дата на продажба; општа
сума на продажба; продукти, закупени со дадена продажба; продадено
количество од соодветен продукт; продажна цена; попус како и процент
од продажната цена за купување на големо количество од даден продукт;
попус како и за процент од целата сума за купување на вредност над
дадена сума или за клиенти со годишна сума на пазарување над дадена
сума.
Решение: