sql server+c++
.pdfг) Ідентифікуючий зв’язок «один до одного чи багатьох».
ця лінія вказує на те, що одній стрічці у таблиці Group ставиться у відповідність лише одна стрічка з таблиці Course
Course |
|
Group |
|
|
|
|||
|
|
NOT NULL |
належать |
|
NameGRP |
|
NOT NULL |
|
|
NameCRS |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
Institute NOT NULL |
|
|
NameCRS (FK) |
NOT NULL |
|||
|
|
|
Note |
|
NULL |
|||
|
|
|
|
|
|
|||
|
|
|
|
|
|
цей «воронячий слід» з рискою вказує на те, що одній стрічці у таблиці Course ставиться у відповідність одна або декілька стрічок з таблиці Group
д) Неідентифікуючий зв’язок «один до одного чи багатьох».
Course |
|
Group |
|
|
|
||||
|
|
NOT NULL |
|
належать |
|
NameGRP |
|
NOT NULL |
|
|
NameCRS |
|
|
|
|||||
|
Institute NOT NULL |
|
|
|
|
|
|
|
|
|
|
|
|
NameCRS (FK) |
|
NOT NULL |
|
||
|
|
|
|
|
|
Note |
|
NULL |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
е) Неідентифікуючий зв’язок «нуль чи один до нуля, одного чи багатьох».
цей єдиний кружечок вказує на те, що одній стрічці у таблиці Group ставиться у відповідність нуль або одна стрічка з таблиці Course
Course |
|
Group |
|
|
|
|||
|
|
NOT NULL |
належать |
|
NameGRP |
NOT NULL |
||
|
NameCRS |
|
||||||
|
Institute NOT NULL |
|
|
|
|
|
|
|
|
|
NameCRS (FK) |
NULL |
|||||
|
|
|
|
|
Note |
|
NULL |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
цей «воронячий слід» з кружком вказує на те, що одній стрічці у таблиці Course ставиться у відповідність нуль чи декілька стрічок з таблиці Group
9
є) Неідентифікуючий зв’язок «нуль чи один до нуля чи одного».
цей єдиний кружечок вказує на те, що одній стрічці у таблиці Group ставиться у відповідність нуль або одна стрічка з таблиці Course
Course |
|
Group |
|
|
|
|||
|
NameCRS |
NOT NULL |
належать |
|
NameGRP |
NOT NULL |
||
|
|
|
|
|
|
|
|
|
|
Institute NOT NULL |
|
|
|
|
|
|
|
|
|
|
NameCRS (FK) |
NULL |
||||
|
|
|
|
|
Note |
|
NULL |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
цей єдиний кружечок вказує на те, що одній стрічці у таблиці Course ставиться у відповідність нуль чи одна стрічка з таблиці Group
ж) Зв’язок «багато до багатьох».
Student |
|
Subject |
|
IDstd |
IDENTITY |
IDsbj |
IDENTITY |
Surname NOT NULL |
NameSubject NOT NULL |
|
|
|
|
|
|
|
|
зв’язок «багато до багатьох» |
|
|||||
|
|
|
|
|
|
|
|
реалізується за допомогою до- |
|
|||||
|
|
|
|
|
|
|
|
даткової стикувальної таблиці |
|
|||||
Student |
|
Joint |
|
Subject |
|
|
||||||||
|
IDstd |
|
IDENTITY |
|
IDstd (FK) |
NOT NULL |
|
|
IDsbj |
|
IDENTITY |
|||
|
|
|
|
|
|
NOT NULL |
|
|
|
|
|
|
||
|
Surname NOT NULL |
|
IDsbj (FK) |
|
|
NameSubject NOT NULL |
||||||||
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
АБО |
|
|
|||
Student |
|
|
Joint |
|
Subject |
|
|
||||||||
|
IDstd |
|
IDENTITY |
|
|
ID_Joint NOT NULL |
|
|
IDsbj |
|
IDENTITY |
||||
|
Surname NOT NULL |
|
|
|
|
|
|
|
|
NameSubject NOT NULL |
|||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
NOT NULL |
|
|
||||||||
|
IDstd (FK) |
|
|||||||||||||
|
|
|
|
|
|
|
NOT NULL |
|
|
|
|
|
|
||
|
|
|
|
|
|
IDsbj (FK) |
|
|
|
|
|
|
|||
10 |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рекурсивні види зв’язку:
а) Рекурсивний зв’язок «один до одного» типу список.
List
|
|
|
|
|
|
ID |
|
IDENTITY |
|
|
Sername NOT NULL |
|||
|
Name |
NULL |
||
|
ID2 (FK) |
NULL |
(AK1.1) |
|
|
|
|
|
|
наступний
б) Рекурсивний зв’язок «один до нуля чи багатьох» типу дерево.
Tree
ID |
|
IDENTITY |
Sername NOT NULL |
||
Name |
NULL |
|
ID2 (FK) |
NULL |
підлеглий
в) Рекурсивний зв’язок «багато до багатьох» типу сітка.
Network
ID IDENTITY
Sername NOT NULL
Name NULL
Network
ID IDENTITY
Sername NOT NULL
Name NULL
рекурсивний зв’язок «багато до багатьох» реалізується за допомогою додаткової стикувальної таблиці
Joint
ID1 (FK) NOT NULL
ID2 (FK) NOT NULL
11
Позначення специфікацій для правил видалення та обновлення стрічок у зв’язаних таблицях
R |
Restrict |
Накладає обмеження (заборону) на видалення чи |
|
|
зміну значення потенційного ключа, якщо існують |
|
|
для нього значення зовнішнього ключа. |
C |
Cascade |
Поширює будь-які модифікації для значення по- |
|
|
тенційного ключа основної таблиці на відповідні |
|
|
їм значення зовнішнього ключа залежної таблиці. |
|
|
При видаленні стрічки – видаляються усі залежні |
|
|
стрічки в підлеглій таблиці, при зміні значення |
|
|
потенційного ключа – змінюються відповідні зна- |
|
|
чення зовнішнього ключа у залежних стрічках. |
SN |
Set Null |
При будь-якій модифікації (видалення, обновлен- |
|
|
ня) значення потенційного ключа основної таблиці |
|
|
у зовнішні ключі залежних стрічок встановлю- |
|
|
ються null-значення. |
SD |
Set Default |
При модифікації (видалення, обновлення) значень |
|
|
потенційного ключа зовнішні ключі приймають |
|
|
визначені значення за замовчуванням. Наприклад, |
|
|
при видаленні останньої групи (КС-43) усі її |
|
|
студенти автоматично переводяться у першу |
|
|
групу, тобто приймають визначене значення за |
|
|
замовчуванням (КС-41), при умові, що таке |
|
|
значення для потенційного ключа існує. |
D:Delete rule Префікс для правила видалення.
U:Update rule Префікс для правила обновлення.
Parent |
|
|
D:C |
Child |
|
|
|
|||
|
ID |
|
INTEGER |
|
U:SN |
|
ChildName |
|
CHAR(10) |
|
|
|
|
|
|
|
|
|
|
|
|
|
Name |
CHAR(10) |
|
|
ID_Par (FK) |
INTEGER |
||||
|
|
|
|
|
|
|
||||
|
|
Birthday |
|
DATE |
||||||
|
Surname |
CHAR(10) |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
Рис. 2.13. Позначення правил механізму цілісності посилань
12
3.Основні конструкції SQL-сценарію для створення БД
3.1.Оператори визначення даних DDL (Data Definition
Language).
Ці оператори мови SQL призначені для опису структури баз даних. Фактично, усі маніпуляції зі структурою БД побудовані на основі таких трьох операторів:
A. Оператор CREATE.
Створює різні об’єкти бази даних, з визначеним додатковим синтаксисом для кожного об’єкта окремо.
CREATE <тип об’єкта> <ім’я об’єкта> ...
B. Оператор ALTER.
Дає можливість вносити зміни в об’єкти бази даних після їхнього створення. За синтаксисом цей оператор подібний до CREATE.
ALTER <тип об’єкта> <ім’я об’єкта> …
C. Оператор DROP.
Виконання цього оператора призводить до повного видалення будь-якого вказаного у ньому об’єкта (об’єктів). Синтаксис оператора залишається повністю однаковим для всіх основних об’єктів бази даних. Особливістю його є те, що за один раз він може знищувати одразу декілька однакових об’єктів, вказаних через кому.
DROP <тип об’єкта> <ім’я об’єкта> [ , … n]
3.2. Створення Бази Даних (CREATE DATABASE).
Процес створення бази даних полягає у визначенні імені, розміру та розташування файлів. Після створення база даних буде доступна лише адміністратору та користувачу, що її створив, для всіх решта – необхідно буде призначати права доступу до неї. Важливим моментом є те, що створювати об’єкти бази даних можна лише на локальному сервері.
Найпростіша синтаксична форма для створення бази даних може виглядати так:
CREATE DATABASE KSA ;
13
Усі бази даних створюються на основі системної бази model, і тому при такому найпростішому синтаксисі створиться нова база даних з копією об’єктів та параметрів бази даних model, а назви файлів будуть визначені на основі назви створюваної бази даних та розміщені у папці на диску, що є призначена за замовчуванням для сервера.
Для встановлення додаткових параметрів використовують розширену форму синтаксису оператора CREATE DATABASE.
CREATE DATABASE <ім’я бази даних>
[ ON [ PRIMARY ]
(
NAME = ' <логічне ім’я файла> ' , FILENAME = ' <ім’я файла в ОС>.mdf '
[ , SIZE = <розмір> [ KB | MB | GB | TB ] ]
[ , MAXSIZE ={<макс. розмір> [ KB | MB | GB | TB ] | UNLIMITED } ] [ , FILEGROWTH = <значення приросту> [ KB | MB | GB | TB | % ] ]
)
[ ,...n ]
]
[ LOG ON
(
NAME = ' <логічне ім’я файла> ' , FILENAME = ' <ім’я файла в ОС>.ldf '
[ , SIZE = <розмір> [ KB | MB | GB | TB ] ]
[ , MAXSIZE ={<макс. розмір> [ KB | MB | GB | TB ] | UNLIMITED } ] [ , FILEGROWTH = <значення приросту> [ KB | MB | GB | TB | % ] ]
)
[ ,...n ]
]
[;]
-- параметри за замовчуванням підкреслені сірим фоном
Ім’я нової бази даних повинно бути унікальним всередині екземпляра SQL Server та мати максимальну довжину 128 символів.
Ключове слово ON вказує на явне визначення параметрів файлу з даними. Необов’язковий параметр PRIMARY вказує, що створювані файли належать до основної файлової групи, призначеної для фізичного зберігання даних. Для бази даних також можна передбачити вторинні файлові групи, однак, для нашої роботи достатньо викорис-
14
тати передбачену за замовчуванням структуру бази даних, в якій уся інформація зберігається в одному файлі.
Ключове слово LOG ON вказує на явне визначення параметрів файлу журналу бази даних.
Ключове слово NAME задає логічне ім’я файлу, яке використовується в SQL Server при посиланні на файл.
Ключове слово FILENAME задає ім’я файлу в операційній системі (фізичне ім’я). Файл з даними має мати розширення .mdf, додаткові файли з даними мають розширення .ndf, a файли журналів – .ldf.
Ключове слово SIZE задає початковий розмір файлу.
Ключове слово MAXSIZE задає максимальний розмір, до якого може збільшуватися в об’ємі файл. Параметр UNLIMITED вказує, що файл може збільшуватися в об’ємі аж до повного заповнення простору диску. Для файлу журналу встановлене обмеження сягає 2 ТБ, а для файлу з даними – 16 ТБ.
Ключове слово FILEGROWTH задає розмір автоматичного приросту для файлу. Значення цього параметра не може перевищувати значення параметра MAXSIZE. Значення 0 вказує, що автоматичний приріст відключений і додавання простору заборонено. Якщо параметр FILEGROWTH є не заданий, тоді значенням за замовчуванням є 1МБ для файлів з даними та 10% для файлів журналів.
Проілюструємо на прикладі створення бази даних з явним визначенням файлу даних та журналу. Перед початком створення доцільно перевірити існування на сервері бази даних з таким ж іменем. Команду створення бази даних слід подавати з системної бази даних master.
USE master
GO
--якщо база даних з таким іменем вже існує, тоді вона знищується
IF DB_ID ('KSA') IS NOT NULL
DROP DATABASE KSA GO
--створюється нова база даних
CREATE DATABASE KSA
ON PRIMARY
( NAME = 'KSA2', FILENAME = 'C:\data\KSA.mdf' , SIZE = 3MB ,
MAXSIZE = UNLIMITED, FILEGROWTH = 1MB )
LOG ON
( NAME = 'KSA2_log', FILENAME = 'C:\data\KSA_log.ldf' , SIZE = 1MB ,
MAXSIZE = UNLIMITED , FILEGROWTH = 10% )
15
3.3. Створення Таблиці.
Оператор CREATE TABLE є доволі складним та потребує не лише створення нової таблиці, але й опису стовпців, обмежень, первинних та вторинних ключів. Тому будемо розглядати його по частинах. Його загальний синтаксис виглядає так:
CREATE TABLE
[ <ім’я бази> . [<ім’я схеми>] . | <ім’я схеми> . ] <ім’я таблиці> ( { <визначення стовпця> | <визначення обчислюваного стовпця> }
[ <табличні обмеження> ] [ , ...n ]
) [ ON { <файлова група> | 'default' } ]
[ TEXTIMAGE_ON { <файлова група> | 'default' } ] [ ; ]
Ім’я нової таблиці повинно бути унікальним всередині схеми зазначеної бази даних та мати максимальну довжину 128 символів. Якщо ім’я бази даних не вказано, то таблиця створюється у поточній базі даних, якщо ж не вказана і схема, тоді за замовчуванням таблиця створюється у схемі dbo.
Ключове слово ON визначає файлову групу, в якій буде зберігатися таблиця.
Ключове слово TEXTIMAGE_ON визначає файлову групу, в якій будуть зберігатися стовпці з типами даних text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max). Якщо ж у таблиці немає стовпців з такими типами даних, тоді цей параметр є недопустимий.
3.3.1. Створення стовпців.
Перелік стовпців описується таким синтаксисом:
<ім’я стовпця> <тип даних> [ NULL | NOT NULL ]
[ DEFAULT <значення> | IDENTITY [ ( seed , increment ) ] ] [ <стовпцеві обмеження> ]
[ , ... n ]
Ім’я стовпця повинно бути унікальним в межах таблиці та мати максимальну довжину 128 символів.
Перелік доступних типів даних з їх детальним описом наведений в інструкції до лабораторної роботи № 2 з цього предмету [13].
16
Опція NULL чи NOT NULL вказує, чи стовпець допускає ввід nullзначень. Якщо стовпець є автоінкрементим, чи на ньому побудований первинний ключ, то для даного стовпця цей параметр повинен бути обов’язково вказаний як NULL, або взагалі не вказаний (інакше сервер згенерує помилку).
Ключове слово DEFAULT вказує значення за замовчуванням для вибраного стовпця, що присвоюється йому при відсутності явно заданого значення при вставленні стрічки.
Ключове слово IDENTITY вказує, що стовпець є автоінкрементний. Для нього необхідно вказати початкове значення та значення приросту, або нічого не вказувати. Якщо параметри явно не задані, тоді використовуються значення за замовчуванням (1,1). У таблиці може бути визначений як автоінкрементний лише один стовпець. Однак можуть бути визначені ще додатково глобальні ідентифікатори
GUID.
Для кожного стовпця також можуть бути визначені обмеження у вигляді ключів чи перевірного обмеження CHECK.
Покажемо на прикладі процес створення таблиці:
USE KSA GO
CREATE TABLE Student
(
ID |
int |
|
IDENTITY , |
Surname |
nchar(10) |
NOT NULL , |
|
Name |
nchar(10) |
NULL , |
|
Hobby |
nchar(15) |
NOT NULL |
DEFAULT 'No' , |
Date |
datetime |
NULL |
DEFAULT GETDATE() , |
GuidID |
uniqueidentifier |
NOT NULL |
DEFAULT NEWID() |
)
Перед створенням таблиці необхідно переключитися на робочу базу даних (у прикладі – USE KSA), для якої має бути створена таблиця, в іншому випадку, слід вказати повний шлях в її імені.
Стовпець ID створюється як автоінкрементний, і тому ми опустили опцію NOT NULL (хоча могли і вказати). За замовчуванням відлік почнеться від одиниці з одиничним приростом.
Для стовпця Hobby ми визначили значення за замовчуванням. Якщо для стовпця Date не вказується значення, то воно за замов-
чуванням генерується системною функцією GETDATE().
Стовпець GuidID визначений як GUID-ідентифікатор, та за замовчуванням заповнюється системною функцією NEWID().
17
Якщо у таблиці заповнити, наприклад, лише стовпець Surname такими значеннями: Ступченко, Іванів, Парфенюк, то решта значень визначаться значеннями за замовчуванням, або встановляться NULL. При вибірці даних із цієї таблиці отримаємо такий результат:
|
ID |
Surname |
Name |
Hobby |
Date |
|
GuidID |
|||
|
|
|
|
|
|
|
|
|
|
|
1 |
Ступченко |
NULL |
No |
2009-11-11 14:29:18 |
2A97CBEA-D7E1-457E-9397-DA51F6A86D50 |
|||||
2 |
Іванів |
NULL |
No |
2009-11-11 14:29:36 |
5551279D-8294-4740-8158-71FD230D7BBE |
|||||
3 |
Парфенюк |
NULL |
No |
2009-11-11 14:29:49 |
212ABF39-EBC9-484B-A32E-74B9597D0C8D |
3.3.2. Створення обчислювальних стовпців.
Обчислювальний стовпець представляє собою віртуальний стовпець, що фізично не зберігається в таблиці, якщо для нього не встановлена опція PERSISTED. Значення стовпця обчислюється на основі виразу, з використанням значень інших стовпців цієї ж таблиці. Вирази можуть містити імена необчислювальних стовпців, константи та функції, однак, не можуть містити вкладені запити та значення з інших таблиць.
Обчислювальний стовпець описується таким синтаксисом:
<ім’я обчислювального стовпця> |
AS <обчислювальний вираз> |
[ PERSISTED [ NOT NULL ] ] |
[ <стовпцеві обмеження> ] |
|
|
Опція PERSISTED дає можливість фізично зберігати значення для обчислювального стовпця. Якщо ця опція встановлена, тоді для обчислювального стовпця з’явиться можливість побудувати індекс.
CREATE TABLE Order_list |
|
|
|
( |
|
|
|
ID |
int |
NOT NULL |
IDENTITY , |
Name |
nchar(10) |
NOT NULL , |
|
Number |
int |
NULL , |
|
Price |
decimal(6,2) |
NULL |
DEFAULT 0 , |
Total AS Number*Price
)
Для стовпців, що беруть участь в обчислювальному виразі, варто призначати значення за замовчуванням, особливо це актуально для цифрової звітності. Якщо ж одне зі значень є невизначене, тобто null, тоді вираз не буде обчислений, і повернеться також значення null.
18