Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

SUBD Labs 1-7

.pdf
Скачиваний:
51
Добавлен:
12.02.2016
Размер:
671.43 Кб
Скачать

messageID INT UNSIGNED NOT NULL, authorID INT UNSIGNED NOT NULL, text TEXT NOT NULL,

status ENUM ('published', 'unpublished', 'deleted') DEFAULT 'published',

posted TIMESTAMP NOT NULL, PRIMARY KEY (commentID),

CONSTRAINT comment_message FOREIGN KEY (messageID) REFERENCES MyCMS.MESSAGE (messageID) ON DELETE CASCADE ON

UPDATE CASCADE

) ENGINE = InnoDB;

CREATE TABLE MyCMS.FILE (

fileID INT UNSIGNED NOT NULL AUTO_INCREMENT, messageID INT UNSIGNED NOT NULL,

authorID INT UNSIGNED NOT NULL, fname CHAR(39) NOT NULL,

path CHAR(199) NOT NULL, type CHAR(5) NOT NULL, size INT(10) UNSIGNED,

UNIQUE UQ_File_Message (fileID, messageID),

PRIMARY KEY (fileID),

CONSTRAINT file_message FOREIGN KEY (messageID) REFERENCES MyCMS.MESSAGE (messageID) ON DELETE NO ACTION ON

UPDATE NO ACTION,

CONSTRAINT file_author FOREIGN KEY (authorID) REFERENCES MyCMS.AUTHOR (authorID) ON DELETE NO ACTION ON

UPDATE NO ACTION ) ENGINE = InnoDB;

CREATE TABLE MyCMS.SESSION ( sessionID CHAR(100) NOT NULL, authorID INT UNSIGNED NOT NULL, start TIMESTAMP NOT NULL, sessioninfo VARCHAR(255),

CONSTRAINT session_author FOREIGN KEY (authorID) REFERENCES MyCMS.AUTHOR (authorID) ON DELETE NO ACTION ON

UPDATE NO ACTION ) ENGINE = InnoDB;

CREATE TABLE MyCMS.MESSAGE_CATEGORY ( messageID INT UNSIGNED NOT NULL, categoryID INT UNSIGNED NOT NULL,

CONSTRAINT cat_category FOREIGN KEY (categoryID) REFERENCES MyCMS.CATEGORY (categoryID) ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT cat_message FOREIGN KEY (messageID) REFERENCES MyCMS.MESSAGE (messageID) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE = InnoDB;

Висновок: на цій лабораторній роботі було завершено моделювання і засобами SQL створено базу даних, що складається з восьми таблиць.

Лабораторна робота №3

з курсу “СУБД” на тему:

“Модифікація структури таблиць бази даних засобами SQL”

Мета роботи: Розробити SQL запити для зміни структури таблиць бази даних (включення нових полів, вилучення полів таблиць, зміни опису полів, зміни обмежень).

Короткі теоретичні відомості.

Для зміни структури таблиць використовується наступна директива мови SQL.

Синтаксис:

ALTER [IGNORE] TABLE ім’я_таблиці

опис_зміни [, опис_зміни ...]

опис_зміни:

[додаткові_параметри ...]

| ADD [COLUMN] назва_поля опис_поля

[FIRST | AFTER назва_поля ]

| ADD [COLUMN] (назва_поля опис_поля,...)

| ADD {INDEX|KEY} [ім’я_обмеження] (назва_поля,...)[тип_обмеження] | ADD [CONSTRAINT [ім’я_обмеження]] PRIMARY KEY (назва_поля,...) [тип_обмеження]

| ADD [CONSTRAINT [ім’я_обмеження]]

UNIQUE [INDEX|KEY] [ім’я_обмеження](назва_поля,...)[тип_обмеження] | ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [ім’я_обмеження] (назва_поля,...) [тип_обмеження]

| ADD [CONSTRAINT [ім’я_обмеження]]

FOREIGN KEY [ім’я_обмеження] (назва_поля,...) опис_зв’язку

| ALTER [COLUMN] назва_поля {SET DEFAULT значення | DROP DEFAULT} | CHANGE [COLUMN] стара_назва_поля нова_назва_поля опис_поля

[FIRST|AFTER назва_поля]

| MODIFY [COLUMN] назва_поля опис_поля

[FIRST | AFTER назва_поля]

| DROP [COLUMN] назва_поля | DROP PRIMARY KEY

| DROP {INDEX|KEY} ім’я_обмеження

| DROP FOREIGN KEY ім’я_обмеження

| RENAME [TO] нова_назва_таблиці

| ORDER BY назва_поля [,назва_поля] ...

| CONVERT TO CHARACTER SET кодування [COLLATE набір_правил]

| [DEFAULT] CHARACTER SET [=] кодування [COLLATE [=] набір_правил]

додаткові_параметри:

{ENGINE|TYPE} [=] тип_таблиці

| AUTO_INCREMENT [=] початкове_значення | AVG_ROW_LENGTH [=] значення

| [DEFAULT] CHARACTER SET [=] кодування

| CHECKSUM [=] {0 | 1}

| [DEFAULT] COLLATE [=] набір_правил

| COMMENT [=] 'коментар до таблиці'

| DELAY_KEY_WRITE [=] {0 | 1} | MAX_ROWS [=] значення

| MIN_ROWS [=] значення

| ROW_FORMAT {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

Аргументи:

тип_обмеження

Вказує тип індексу для поля: USING {BTREE | HASH | RTREE}.

IGNORE

Ігнорувати помилки дублювання значень в ключових полях, тобто залишати в таблиці перше значення, і видаляти дублікат. За замовчуванням, при таких помилках вся дія над таблицею відміняється.

ALTER назва_поля

Використовується для зміни значення за замовчуванням для поля.

MODIFY назва_поля

Змінити тип поля.

CHANGE назва_поля

Змінити назву і тип поля.

FIRST | AFTER

Змінити розташування поля в таблиці. За замовчуванням, нове поле додається в кінець таблиці. FIRST додасть його на початок; AFTER – одразу після вказаного поля.

DROP назва_поля

Видалення поля, обмеження чи індексу.

ORDER BY

Відсортувати рядки в таблиці за зростанням значень у вказаному полі (полях).

AUTO_INCREMENT

При зміні початкового значення для приросту поля-лічильника, слід вказати значення більше за ті, які вже містяться в цьому полі.

CONVERT TO

Задає кодування, в яке потрібно перевести таблицю.

RENAME TO

Змінити назву таблиці на вказану. Для зміни назви таблиці, або для переносу таблиці в іншу базу, також можна використати директиву RENAME TABLE

ім’я_бази_1.назва_таблиці_1 TO ім’я_бази_2.назва_таблиці_2.

Хід роботи.

Виконаємо команди: SHOW TABLES; DESCRIBE FILE.

Виконаємо такі операції над схемою бази даних.

1.Вилучимо зв’язок file_author.

2.Вилучимо і змінимо поля в таблиці File.

3.Змінимо поле в таблиці Author.

4.Додамо поле до таблиці Message і створимо таблицю Version.

5.Змінимо тип обмеження цілісності для зв’язку file_message.

1.Видалення зв’язку між таблицями шляхом видалення обмеження для таблиці:

ALTER TABLE MyCMS.FILE

DROP FOREIGN KEY file_author,

DROP INDEX file_author;

Для перевірки результату можна виконати команди SHOW INDEX FROM file, та

SHOW CREATE TABLE file.

2.Видалення 2-ох полів і зміна розмірності 2-х полів в таблиці File. Тепер шлях до файлу буде зберігатися не окремо, а разом із назвою.

ALTER TABLE MyCMS.FILE DROP COLUMN authorID, DROP COLUMN path,

MODIFY COLUMN fname char(99) NOT NULL, MODIFY COLUMN size int(9) NULL;

3.Зробимо поле Name в таблиці Author необов’язковим і змінимо його розмірність:

ALTER TABLE MyCMS.AUTOR

MODIFY COLUMN name CHAR(60) NULL;

4.Додамо до таблиці Message поле versionID, яке дозволить зберігати різні версії одного і того ж повідомлення. Остання версія повідомлення буде зберігатись у таблиці Message, всі попередні – у новій таблиці Version. Вміст поля versionID – номер версії повідомлення (від 1 до 255).

ALTER TABLE MyCMS.MESSAGE

ADD COLUMN versionID TINYINT UNSIGNED NOT NULL AFTER messageID;

CREATE TABLE MyCMS.VERSION( messageID INT UNSIGNED NOT NULL,

versionID TINYINT UNSIGNED NOT NULL, message TEXT NOT NULL,

posted DATETIME NOT NULL, rating TINYINT,

PRIMARY KEY (messageID, versionID),

CONSTRAINT version_message FOREIGN KEY (messageID) REFERENCES MyCMS.MESSAGE (messageID) ON DELETE CASCADE

) ENGINE = InnoDB;

Виконаємо команду DESCRIBE VERSION.

5.Змінимо обмеження цілісності file_message так, щоб при видаленні повідомлення, з бази видалялись записи про всі приєднані до нього файли. Для цього потрібно видалити обмеження і створити нове, оскільки MySQL не підримує директиви ALTER CONSTRAINT.

ALTER TABLE MyCMS.FILE

DROP FOREIGN KEY file_message,

ADD CONSTRAINT file_message FOREIGN KEY (messageID)

REFERENCES MyCMS.MESSAGE (messageID) ON DELETE CASCADE;

Для перевірки результату можна виконати команду SHOW CREATE TABLE file.

Висновок: на цій лабораторній роботі було розглянуто методи модифікації структури таблиць БД засобами SQL та проведено модифікацію полів, зв’язків і обмежень.

Лабораторна робота №4

з курсу “СУБД” на тему:

“Запити на додавання, зміну та вилучення даних”

Мета роботи: Розробити SQL-запити для внесення нових значень в таблиці в режимі одиничного та групового доповнення; розробити SQL-запити для внесення змін в рядки таблиць; розробити SQL-запити для вилучення вибраних рядків.

Короткі теоретичні відомості.

Для внесення значень в таблиці використовується директива INSERT.

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] назва_таблиці [(назва_поля,...)]

|{VALUES | VALUE} ({вираз | DEFAULT},...),(...),...

| [SET назва_поля={вираз | DEFAULT}, ...] | [вибірка_даних]

[ON DUPLICATE KEY UPDATE назва_поля=вираз [, назва_поля=вираз]...]

Аргументи:

IGNORE

Ігнорувати дублювання значень в ключових полях, тобто залишати в таблиці існуючий рядок, і не вставляти дублікат. За замовчуванням, при такій помилці вся дія над таблицею відміняється.

VALUES

Задає набір значень, які будуть вставлятися у задані поля таблиці з дотриманням вказаного у дужках порядку полів. Якщо перелік полів не задано, то відповідне значення потрібно задати для кожного поля таблиці.

DEFAULT

Внесення значення за замовчуванням у вказане поле.

вираз

Константа, змінна, або інший вираз (див. табл. далі). Наприклад: поле2=поле1*0.5.

вибірка_даних

Довільна SELECT-директива, результати виконання якої будуть внесені в таблицю.

ON DUPLICATE KEY UPDATE

Якщо при внесенні нового рядка, значення в ключових полях дублюються, то ця директива задає вираз, за яким формуються нові значення полів наявного в таблиці (старого) рядка. Новий рядок не буде внесений в таблицю.

Наступна директива MySQL дозволяє заносити дані в таблицю із зовнішнього файлу. У такому файлі, значення полів повинні розділятись символами табуляції, а кожен рядок таблиці – починатись з нового рядка файлу, або розділятись додатковими символами.

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'назва_файлу' [REPLACE | IGNORE]

INTO TABLE назва_таблиці

[CHARACTER SET кодування] [{FIELDS | COLUMNS}

[TERMINATED BY 'символ_завершення']

[[OPTIONALLY] ENCLOSED BY 'символ'] [ESCAPED BY 'символ']]

[LINES [STARTING BY 'символи_початку'] [TERMINATED BY 'символи_завершення']]

[IGNORE кількість LINES]

Для внесення змін в записи таблиці використовується директива UPDATE.

UPDATE [LOW_PRIORITY] [IGNORE] назва_таблиці

SET назва_поля1={вираз|DEFAULT} [, назва_поля2={вираз|DEFAULT}]...

[WHERE умова_відбору] [ORDER BY ...]

[LIMIT кількість_рядків]

Аргументи:

SET

Задає список полів, значення яких будуть змінюватись, і відповідні дії над ними.

DEFAULT

Вставка значення за замовчуванням у вказане поле.

WHERE

Вказує умову, за якою відбираються рядки, що підлягають зміні.

ORDER BY

Може вказувати поле, за яким сортувати рядки перед зміною, з метою уникнення порушення цілісності таблиці.

LIMIT

Обмежує кількість рядків, які будуть змінені.

Для видалення записів з таблиці використовується директива DELETE.

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM назва_таблиці

[WHERE умова_відбору] [ORDER BY ...]

[LIMIT кількість_рядків]

Аргументи:

FROM

Вказує таблицю, з якої слід видалити значення.

WHERE

Вказує умову, за якою відбираються рядки, що підлягають видаленню.

ORDER BY

Вказує поле (поля), за яким сортувати рядки перед видаленням. Начастіше використовується з опцією LIMIT.

LIMIT

Обмежує кількість рядків, які будуть видалені.

При побудові виразів та запитів, можна використовувати оператори та функції MySQL. Основні з них описані у таблиці 1.

 

 

 

Таблиця 1. Основні функції та оператори в MySQL.

 

 

 

 

 

Функція (оператор)

 

Опис

 

AND, OR

 

Логічне “і” та логічне “або”.

 

 

 

 

~, &, | , ^

 

Побітові операції інверсії, логічного “і”, “або”,

 

“виключного або”.

 

 

 

 

 

 

 

 

AVG(), MAX(), MIN()

 

Знаходить середнє, максимальне, або мінімальне

 

 

значення для заданих аргументів.

 

 

 

 

ABS()

 

Повертає модуль числа.

 

 

 

 

 

POW(Х, У)

 

Повертає число Х у степені У.

 

 

 

 

 

RAND()

 

Повертає псевдовипадкове число з плаваючою крапкою.

 

 

 

 

 

NOT IN()

 

Перевіряє, чи не входить значення до множини вказаних

 

 

значень.

 

 

 

 

NULLIF(вираз1, вираз2)

 

Повертає NULL, якщо значення рівні між собою.

 

 

 

 

 

IF(вираз1, вираз2, вираз3)

 

Повертає вираз2, якщо виконується вираз1. В

 

 

протилежному випадку повертає вираз3.

 

 

 

 

 

 

 

 

SIN(); COS(); TAN(); COT(); LN()

 

Повертає значення синуса, косинуса, тангенса,

 

 

котангенса, натурального логарифма.

 

BETWEEN ... AND ...

 

Перевіряє, чи входить значення у заданий діапазон.

 

 

 

 

 

COUNT()

 

Рахує кількість рядків, які повертає запит.

 

 

 

 

 

COUNT(DISTINCT)

 

Рахує кількість різних значень.

 

 

 

 

 

CHAR_LENGTH(рядок)

 

Повертає кількість символів в аргументі.

 

 

 

 

 

CONCAT(рядок1, ...)

 

Повертає об’єднані рядки.

 

 

 

 

 

NOW(),

 

Повертає поточну дату і час у форматі

 

СURRENT_TIMESTAMP()

 

'YYYY-MM-DD HH:MM:SS'.

 

CURRENT_DATE(),

 

Повертає поточну дату.

 

CURRENT_DATE

 

 

 

 

 

CURRENT_TIME(),

 

Повертає поточний час.

 

CURRENT_TIME

 

 

 

 

 

 

 

 

 

DAYOFMONTH(дата)

 

Повертає день місяця з отриманої дати.

 

 

 

 

 

MONTH(дата)

 

Повертає номер місяця, присутнього в отриманій даті.

 

 

 

 

 

YEAR(дата)

 

Повертає рік з отриманої дати.

 

 

 

 

 

ROW_COUNT()

 

Рахує кількість рядків, оновлених останнім запитом.

 

 

 

 

 

BENCHMARK(к-сть, вираз)

 

Виконує вираз вказану кількість разів і повертає час

 

 

виконання. Замість виразу можна вказати запит, який

 

 

 

повинен повертати максимум одне значення.

 

 

 

 

 

COMPRESS(рядок_символів),

 

Якщо MySQL встановлений з бібліотекою zlib, функції

 

UNCOMPRESS(рядок_символів)

 

дозволяють стискати і розпаковувати символьні рядки.

 

 

 

 

 

AES_ENCRYPT(значення, ключ),

 

128-бітне шифрування і дешифрування рядків за заданим

 

AES_DECRYPT(значення, ключ)

 

ключем. Результат шифрування – бінарний рядок.

 

 

 

 

 

MD5(значення)

 

Обчислює MD5-хеш. Результат – бінарний рядок.

 

 

 

 

Хід роботи.

Виконаємо такі чотири запити для внесення даних у таблиці з їх подальшою модифікацією.

1.Заповнимо таблицю Role в режимі одиночного і групового доповнення.

2.Створимо файли з даними і заповнимо ними решту таблиць баз даних.

3.Виконаємо модифікацію значень у таблиці Author.

4.Видалимо записи з таблиці Message.

1.Внесення нових значень в таблицю Role в режимі одиничного доповнення:

INSERT INTO role VALUES (1, ‘Addmin’, ‘full’);

Внесення нових значень в таблицю Role в режимі групового доповнення:

INSERT INTO role

VALUES (NULL, ‘UGroup1’, ‘read, write, changeown’), (NULL, ‘UGroup2’, ‘read, write, changeown’), (NULL, ‘Guests’, ‘read’),

(5, 'SUGroup1', 'read, write, changeown, groupadmin'), (6, 'SUGroup2', 'read, write, changeown, groupadmin');

Таблиця Role після виконання запитів:

2.Створимо файли з даними для таблиць Author і Message. Значення полів у файлі розділяються символом табуляції, а кожен рядок таблиці починається з нового рядка. Виконаємо дві наступні команди імпорту даних.

LOAD DATA INFILE 'f:\author.tbl' INTO TABLE author LINES TERMINATED BY '\r\n';

LOAD DATA INFILE 'f:\message.tbl' INTO TABLE message LINES TERMINATED BY '\r\n';

3.Внесення змін в записи таблиці. Зашифруємо паролі користувачів функцією AES_ENCRYPT з ключем “key-key” і збільшимо всі значення ключового поля на одиницю. Для зміни значень ключа потрібно задати зворотній порядок сортування рядків, щоб уникнути суперечності під час виконання команди.

UPDATE author SET password = AES_ENCRYPT(password, ‘key-key’); UPDATE author SET authorid = authorid + 1

ORDER BY authorid DESC;

Таблиця Author до виконання запитів:

Таблиця Author після виконання запитів:

4.Запит для вилучення старих повідомлень користувачів (крім адміністратора) з таблиці

Message.

DELETE FROM message

WHERE (posted<’2009-02-10’ && authorid!=2);

Таблиця Message до видалення інформації:

Таблиця Message після виконання запиту:

Висновок: у цій лабораторній роботі було розглянуто способи наповнення і модифікації даних в таблицях БД та проведено модифікацію даних у двох таблицях.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]