
Клиент-сервер / экзамен / Опорник
.pdf
3 Індексація
Одна з основних задач, що виникають при роботі з базами даних, – це задача пошуку. При цьому, оскільки інформації в базі даних, як правило, міститься багато, перед програмістами встає задача не просто пошуку, а ефективного пошуку, тобто пошуку за порівняно невеликий час і з достатньою точністю. Для цього (для оптимізації продуктивності запитів) проводять індексацію деяких полів таблиці. Використовувати індекси корисно для швидкого пошуку рядків з вказаним значенням одного стовпця. Без індексу читання таблиці здійснюється по всій таблиці, починаючи з першого запису, поки не будуть знайдені відповідні рядки. Чим більше таблиця, тим більше невигідні витрати. Якщо ж таблиця містить індекс по даних стовпцях, то база даних може швидко визначити позицію для пошуку в середині файлу даних без проглядання всіх даних. Це відбувається тому, що база даних поміщає проіндексовані поля ближче в пам'яті, так, щоб можна було пошвидше знайти їх значення. Для таблиці, що містить 1000 рядків, це буде як мінімум в 100 разів швидше в порівнянні з послідовним перебором всіх записів. Проте у разі, коли необхідний доступ майже до всіх 1000 рядків, буде швидше послідовне читання, оскільки при цьому не вимагається операцій пошуку по диску. Отже іноді індекси бувають тільки перешкодою. Наприклад, якщо копіюється великий об'єм даних в таблицю, то краще не мати ніяких індексів. Проте в деяких випадках вимагається задіювати відразу декілька індексів (наприклад, для обробки запитів до таблиць, що часто використовуються).
Якщо говорити про MySQL, то там існує три види індексів: PRIMARY, UNIQUE, і INDEX, а слово ключ (KEY) використовується як синонім слова індекс (INDEX). Всі індекси зберігаються в пам'яті у вигляді B-деревьев.
PRIMARY – унікальний індекс (ключ) з обмеженням, що всі індексовані їм поля не можуть мати порожнього значення (тобто вони мають позначку NOT NULL). Таблиця може мати тільки один первинний індекс, але він може складатися з декількох полів.
UNIQUE – ключ (індекс), задаючий поля, які можуть мати тільки унікальні значення.
INDEX – звичайний індекс (як ми описали вище). В MySqL, крім того, можна індексувати рядкові поля по заданому числу символів від початку рядка.
4 СУБД MySQL
MySQL – це реляційна система управління базами даних. Тобто дані в її базах зберігаються у вигляді логічно зв'язаних між собою таблиць, доступ до яких здійснюється за допомогою язика запитів SQL. MySQL – вільно поширювана система, тобто платити за її використання не потрібно. Крім того, це досить швидка, надійна і, головне, проста у використанні СУБД, цілком відповідна для не дуже глобальних проектів.
Працювати з MySQL можна не тільки в текстовому режимі, але і в графічному. Існує дуже популярний візуальний інтерфейс (до речі, написаний на PHP) для роботи з цією СУБД. Називається він PhpMyAdmin. Цей інтерфейс дозволяє значно спростити роботу з базами даних в MySQL .
В текстовому режимі робота з базою даних виглядає просто як введення команд в командний рядок (рис 10.2), а результати вибірок повертаються у вигляді своєрідних таблиць, поля в яких налізають один на одного, якщо дані не поміщаються на екран (рис 10.3).
Мал. 10.2. Робота з MySQL в командному рядку. Команда show databases — вивести всі наявні бази даних
PhpMyAdmin дозволяє користуватися всіма перевагами браузера, включаючи прокрутку зображення, якщо воно не уміщається на екран. Багато які з базових SQL-функцій роботи з даними в PhpMyAdmin зведені до інтуїтивно зрозумілих інтерфейсів і дій, що нагадують перехід по посиланнях в Internet. Але, проте, варто все ж таки попрацювати і в текстовому режимі.
121

Мал. 10.3. Робота з MySQL в командному рядку. Результат обробки команди show databases
Перш ніж переходити до детального вивчення язика SQL, декілька слів про установку MySQL і підготовку до роботи. Якщо ви не збираєтеся займатися адмініструванням серверу, то інформація, приведена нижче, стане в нагоді вам тільки для загального розвитку. Отже, встановлюється MySQL дуже просто – автоматично, пару раз натискуйте OK, і все. Після цього ви можете зайти в директорію, де лежать файли типу mysql.exe, mysqld.exe і т.п. (у нас під Windows XP це С:\mysql\bin ) Останній файл запускає Mysql-сервер. В деяких системах сервер запускається у вигляді сервісу. Після запуску серверу слід запустити mysql-клієнт, запустившися програму mysql.exe. Тут навіть пароля не запитають. Більш того, якщо ви наберете
shell> mysql.exe -u root
або
shell>mysql -u root mysql
то отримаєте всі права адміністратора mysql серверу. До речі, виконувати ці команди треба, знаходячись в тій директорії, де лежать файли mysql.exe.
Спершу, не вдаючись в подробиці команд, виправимо ці два недоліки (відсутність пароля у адміністратора і можливість входу анонімним користувачам):
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root';
mysql> DELETE FROM user WHERE user =''; mysql> FLUSH PRIVILEGES;
Всі дані про користувачів MySQL зберігає в таблиці user в спеціальній базі даних mysql, доступ до якої має тільки адміністратор серверу. Тому, щоб змінити який-небудь пароль, потрібно змінити цю таблицю. Пароль задається за допомогою функції PASSWORD, яка кодує введені дані. Окрім зміни пароля адміністратора, потрібно ще видалити всіх користувачів, що не мають логіна (команда DELETE ). Команда Flush Privileges примушує вступити в дію зміни, що відбулися в системній базі даних (mysql).
Тепер створимо базу даних, з якою працюватимемо (ми все ще працюємо як адміністратор серверу):
mysql>create database book;
Якомога помітити, всі команди в MySQL закінчуються крапкою з комою. Якщо ви забули поставити цей знак, то видається запрошення його поставити до тих пір, поки це не буде зроблено:
mysql> show tables -> ->
Тепер остання дія – створимо простого користувача, надамо йому доступ до створеної бази даних, і почнемо працювати.
122
mysql> GRANT ALL PRIVILEGES ON book.* TO vasia@localhost IDENTIFIED '123';
Команда GRANT наділює користувача vasia, що зайшов на сервер з цієї ж машини (з localhost) і що ідентифікується паролем "123", певними правами (в даному випадку всіма) на всі таблиці бази даних book. Тепер ми можемо вийти і зайти як користувач vasia з відповідним паролем:
shell>mysql -u vasia -p Enter password: ***
Welcome to MySQL monitor!...
mysql>
Якщо ви збираєтеся користуватися базою даних на чужому сервері, то його адміністратор виконає всі описані вище дії за вас, тобто все набудує і створить користувача і базу даних. В наступному розділі описані команди язика SQL, які стануть в нагоді для роботи з даними, що зберігаються в СУБД MySQL.
5 Язик SQL
Отже, ми у загальних рисах познайомилися з основними поняттями теорії баз даних, встановили і налаштували для роботи MySQL. Тепер самий час навчитися маніпулювати даними, що зберігаються в базах даних. Для цього нам знадобиться SQL – структурований язик запитів. Цей язик дає можливість створювати, редагувати і видаляти інформацію, що зберігається в базах даних, створювати нові бази даних і багато що інше. SQL є стандартом ANSI (Американський національний інститут стандартів) і ISO (Міжнародна організація по стандартизації).
Трохи історії
Перший міжнародний стандарт язика SQL був прийнятий в 1989 р., його часто називають SQL/89. Серед недоліків цього стандарту виділяють в першу чергу те, що багато важливих властивостей він встановлював як визначувані в реалізації. Звідси відбулася безліч розбіжностей в реалізаціях язика різними виробниками. Крім того, висловлювалися претензії з приводу відсутності в цьому стандарті згадок про практичні аспекти язика, таких як його вбудовування в язик програмування Сі.
Наступний міжнародний стандарт язика SQL був прийнятий в кінці 1992 р. І став називатися SQL/92. Він вийшов набагато більш точним і повним, ніж SQL/89, хоча і не був позбавлений недоліків. В даний час більшість систем майже повністю реалізує цей стандарт. Проте, як відомо, прогрес не зупиниш, і в 1999 році з'явився новий стандарт SQL:1999, також відомий як SQL3. SQL3 характеризується як "об'єктно-орієнтований SQL " і є основою декількох об'єктно-реляційних систем управління базами даних (наприклад, ORACLE8 компанії Oracle, Universal Server компанії Informix і DB2 Universal Database компанії IBM). Цей стандарт є не просто злиттям SQL-92 і об'єктної технології. Він містить ряд розширень традиційного SQL, а сам документ складений так, щоб добитися більш ефективної роботи в області стандартизації в майбутньому.
Якщо говорити про MySQL, то вона відповідає початковому рівню SQL92, містить декілька розширень цього стандарту і прагне повної підтримки стандарту ANSI SQL99, але без збитку для швидкості і якості коду.
Далі, кажучи про основи язика SQL, дотримуватимемося його реалізації в СУБД MySQL.
6 Основні оператори язика SQL
Функції будь-якої СУБД включають:
створення, видалення, зміна бази даних (БД);
додавання, зміна, видалення, призначення прав користувача;
внесення, видалення і зміна даних в БД (таблиць і записів);
вибірку даних з БД.
До перших двох функцій мають доступ тільки адміністратори СУБД або привілейовані користувачі. Розглянемо, як розв'язуються останні дві задачі (насправді це сім задач).
123
Перш ніж що-небудь робити з даними, потрібно створити таблиці, в яких ці дані зберігатимуться, навчитися змінювати структуру цих таблиць і видаляти їх, якщо буде потрібно. Для цього в язиці SQL існують оператори CREATE TABLE, ALTER TABLE і DROP TABLE .
6.1 Оператор CREATE TABLE
Оператор CREATE TABLE створює таблицю із заданим ім'ям в поточній базі даних . Правила для допустимих імен таблиці приведені в документації. Якщо немає активної поточної бази даних або вказана таблиця вже існує, то виникає помилка виконання команди.
Уверсії MySQL 3.22 і більш пізніх ім'я таблиці може бути вказано як ім’я_бази_даних.ім’я_таблиці. Ця форма запису працює незалежно від того, чи є вказана база даних поточною.
Уверсії MySQL 3.23 при створенні таблиці можна використовувати ключове слово TEMPORARY. Тимчасова таблиця автоматично віддаляється після закінчення з'єднання, а її ім'я дійсне тільки протягом даного з'єднання. Це означає, що в двох різних з'єднаннях можуть використовуватися тимчасові таблиці з однаковими іменами без конфлікту один з одним або з існуючою таблицею з тим же ім'ям (існуюча таблиця прихована, поки не видалена тимчасова таблиця).
Уверсії MySQL 4.0.2 для створення тимчасових таблиць необхідно мати привілеї CREATE TEMPORARY TABLES.
Уверсії MySQL 3.23 і більш пізніх можна використовувати ключові слова IF NOT EXISTS для того, щоб не виникала помилка, якщо вказана таблиця вже існує. Слід враховувати, що при цьому ідентичність структур цих таблиць не перевіряється.
Кожна таблиця представлена набором певних файлів в директорії бази даних.
Синтаксис
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ім’я_таблиці [(визначення_колонки...)] [опції_таблиці] [select_вираз]
У виразі визначення_колонки перераховують, які стовпці повинні бути створені в таблиці. Кожний стовпець таблиці може бути порожнім (NULL), мати значення по замовчанню, бути ключовим або автоінкрементним. Крім того, для кожного стовпця обов'язково указується тип даних, які будуть в ньому зберігатися. Якщо не указується ні NULL, ні NOT NULL, то стовпець інтерпретується так, як ніби вказане NULL. Якщо поле позначають як автоінкрементне (AUTO_INCREMENT), то його значення автоматично збільшується на одиницю кожного разу, коли відбувається додавання даних в таблицю і в це поле записується порожнє значення (NULL, тобто нічого не записується) або 0. Автоінкремент в таблиці може бути тільки один, і при цьому він обов'язково повинен бути проіндексирований. Послідовність AUTO_INCREMENT починається з 1. Наявність автоінкременту є однією з особливостей MySQL. Формально опис стовпця (визначення_колонки) виглядає так:
ім’я_колонки тип [NOT NULL | NULL]
[DEFAULT значение_по_умолчанию] [AUTO_INCREMENT][PRIMARY KEY] [reference_definition]
Тип стовпця (тип у виразі визначення_колонки) може бути одним з наступних:
цілий: INT[(length)] [UNSIGNED] [ZEROFILL]
дійсний: REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
символьний: CHAR(length) [BINARY] і VARCHAR(length) [BINARY]
дата і час: DATE і TIME
для роботи з великими об'єктами: BLOB
текстовий: TEXT
множина: ENUM(value1,value2,value3...) і SET(value1,value2,value3...)
Повний список типів дивитеся в документації MySQL.
124
Замість переліку стовпців і їх властивостей в визначенні_колонки можна задавати списки ключових і індексних полів, обмеження і перевірки:
PRIMARY KEY (ім’я_індексованої_колонки ...)
або
KEY [ім’я_індекса] (ім’я_індексованої_колонки...)
або
INDEX [ім’я_індекса] (ім’я_індексованої_колонки...)
або
UNIQUE [INDEX] [ім’я_індекса] (ім’я_індексованої_колонки...)
або
FULLTEXT [INDEX] [ім’я_індекса] (ім’я_індексованої_колонки...)
або |
|
[CONSTRAINT symbol] FOREIGN KEY [ім’я_індекса] |
(ім’я_індексованої_колонки...) |
[reference_definition] |
|
або |
|
CHECK (expr) |
|
При завданні всіх цих елементів вказується список полів (стовпців), які входитимуть в індекс, ключ або обмеження, ім’я_індексованої_колонки записується таким чином:
ім’я_колонки [(довжина_індекса)]
FOREIGN KEY, CHECK і REFERENCES насправді нічого не роблять в MySQL. Вони додані тільки для сумісності з іншими SQL-серверами. Тому на них ми зупинятися не будемо.
Крім всього перерахованого, при створенні таблиці можна вказати деякі її властивості (опції_таблиці), наприклад
такі:
тип таблиці: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
початкове значення лічильника автоінкременту: AUTO_INCREMENT = число середня довжина рядків в таблиці: AVG_ROW_LENGTH = число
коментарі до таблиці (рядок з 60 символів): COMMENT = "рядок"
максимальне і мінімальне передбачуване число рядків: MAX_ROWS = число і MIN_ROWS = число
І останній (знову ж таки опціональний) елемент команди CREATE – цей вираз SELECT (select_вираз). Синтаксис
такий:
[IGNORE | REPLACE] SELECT ... (будь-який коректний вираз SELECT)
125
Якщо при створенні таблиці в команді CREATE указується вираз SELECT, то всі поля, одержані вибіркою, додаються в створювану таблицю.
Приклад 10.1. Створимо таблицю Persons, структура якої була приведена на малюнку 10.1.
mysql>CREATE TABLE Persons (id INT PRIMARY KEY AUTO_INCREMENT first_name VARCHAR(50), last_name
VARCHAR(100), death_date INT description TEXT, photo INT
citizenship CHAR(50) DEFAULT 'Russia');
Приклад 10.1. Створення таблиці Persons
За допомогою специфічної для MySql команди SHOW можна проглянути існуючі бази даних, таблиці в базі даних і поля в таблиці.
Показати всі бази даних:
mysql>SHOW databases;
Зробити поточною базу даних book і показати всі таблиці в ній:
mysql>use book; mysql>show tables;
Показати всі стовпці в таблиці Persons:
mysql> show columns from Persons;
6.2 Оператор DROP TABLE
Оператор DROP TABLE видаляє одну або декілька таблиць. Всі табличні дані і визначення віддаляються, так що при роботі з цією командою слід дотримуватися обережності.
Синтаксис:
DROP TABLE [IF EXISTS] ім’я_таблиці [, ім’я_таблиці...] [RESTRICT | CASCADE]
У версії MySQL 3.22 і більш пізніх можна використовувати ключові слова IF EXISTS, щоб попередити помилку, якщо вказані таблиці не існують.
Опції RESTRICT і CASCADE дозволяють спростити перенесення програми з інших СУБД. В даний момент вони не задіяні.
mysql> DROP TABLE IF EXISTS Persons Artifacts, test;
Приклад 10.2. Використовування оператора DROP TABLE
6.3 Оператор ALTER TABLE
Оператор ALTER TABLE забезпечує можливість змінювати структуру існуючої таблиці. Наприклад, можна додавати або видаляти стовпці, створювати або знищувати індекси або перейменовувати стовпці або саму таблицю. Можна також змінювати коментар для таблиці і її тип.
Синтаксис:
126
ALTER [IGNORE] TABLE ім’я_таблиці alter_specification [, alter_specification ...]
Можна проводити наступні зміни в таблиці (всі вони записуються в alter_specification ):
додавання поля:
ADD [COLUMN] визначення_колонки [FIRST | AFTER ім’я_колонки ]
або
ADD [COLUMN] (визначення_колонки...)
Тут, як і далі, визначення_колонки записується так само, як при створенні таблиці.
Додавання індексів:
ADD INDEX [ім’я_індекса] (ім’я_індексованої_колонки...)
або
ADD PRIMARY KEY (ім’я_індексованої_колонки...)
або
ADD UNIQUE [ім’я_індекса] (ім’я_індексованої_колонки...)
або
ADD FULLTEXT [ім’я_індекса] (ім’я_індексованої_колонки...)
Зміна поля:
ALTER [COLUMN] ім’я_колонки {SET DEFAULT literal | DROP DEFAULT}
або
CHANGE [COLUMN] старе_ім’я_колонки визначення_колонки
або
MODIFY [COLUMN] визначення_колонки
Видалення поля, індексу, ключа:
DROP [COLUMN] ім’я_колонки
DROP PRIMARY KEY
DROP INDEX ім’я_індекса
Перейменування таблиці:
RENAME [TO] нове_ім’я_таблиці
Переупорядковування полів таблиці:
ORDER поле
127
Якщо оператор ALTER TABLE використовується для зміни визначення типу стовпця, але DESCRIBE ім’я_таблиці показує, що стовпець не змінився, то, можливо, MySQL ігнорує дану модифікацію по одній з причин, описаних в спеціальному розділі документації. Наприклад, при спробі змінити стовпець VARCHAR на CHAR MySQL продовжуватиме використовувати VARCHAR, якщо дана таблиця містить інші стовпці із змінною довжиною.
Оператор ALTER TABLE під час роботи створює тимчасову копію початкової таблиці. Необхідна зміна виконується на копії, потім початкова таблиця віддаляється, а нова перейменовується. Це робиться для того, щоб в нову таблицю автоматично потрапляли всі оновлення, окрім невдалих. Під час виконання ALTER TABLE початкова таблиця доступна для читання іншими клієнтами. Операції оновлення і запису в цій таблиці припиняються, поки не буде готова нова таблиця. Слід зазначити, що при використанні будь-якої іншої опції для ALTER TABLE, окрім RENAME, MySQL завжди створюватиме тимчасову таблицю, навіть якщо дані, строго кажучи, і не потребують копіювання (наприклад, при зміні імені стовпця).
Пример10.3. Додамо в створену таблицю Persons поле для запису року народження людини:
mysql> ALTER TABLE Persons ADD bday INTEGER AFTER last_name;
Приклад 10.3. Додавання в таблицю Persons поля для запису року народження людини
Отже, ми навчилися працювати з таблицями: створювати, видаляти і змінювати їх. Тепер розберемося, як робити те ж саме з даними, які в цих таблицях зберігаються.
7 Оператор SELECT
Оператор SELECT застосовується для витягання рядків, вибраних з однієї або декількох таблиць. Тобто з його допомогою ми задаємо стовпці або вирази, які треба витягнути (select_вырази), таблиці (table_references ), з яких повинна проводитися вибірка, і, можливо, умову (where_definition), якій винні відповідати дані в цих стовпцях, і порядок, в якому ці дані потрібно видати.
Крім того, оператор SELECT можна використовувати для витягання рядків, обчислених без посилання на якунебудь таблицю. Наприклад, щоб обчислити, чому рівно 2*2, потрібно просто написати
mysql> SELECT 2*2;
Спрощений структуру оператора SELECT можна представити таким чином:
SELECT select_вираз1, select_вираз2
[FROM table_references [WHERE where_definition]
[ORDER {число | ім’я_колонки | формула} [ASC | DESC] ...]]
Квадратні дужки [ ] означають, що використання оператора, що знаходиться в них, необов'язкове, вертикальна межа | означає перелік можливих варіантів. Після ключового слова ORDER указують ім'я стовпця, число (ціле беззнакове) або формулу і спосіб впорядкування (за збільшенням – ASC, або по убуванню – DESC ). За умовчанням використовується впорядкування за збільшенням.
Коли в select_виразі ми пишемо " * ", це значить вибрати всі стовпці. Окрім " * " в select_вирази можуть використовуватися функції типу max, min і avg.
Приклад 10.4. Вибрати з таблиці Persons всі дані, для яких поле first_name має значення 'Олександр':
mysql> SELECT * FROM Persons
WHERE first_name='Олександр';
Приклад 10.4. Використовування оператора SELECT
128
Вибрати назву і опис ( title, description ) артефакту під номером 10:
mysql> SELECT title,description FROM Artifacts WHERE id=10;
8 Оператор INSERT
Оператор INSERT вставляє нові рядки в існуючу таблицю. Оператор має декілька форм. Параметр ім’я_таблиці у всіх цих формах задає таблицю, в яку повинні бути внесені рядки. Стовпці, для яких задаються значення, указуються в списку імен стовпців (ім’я_колонки) або в частині SET.
Синтаксис:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] ім’я_таблиці [(ім’я_колонки...)] VALUES (вираз...),(...)...
Ця форма команди INSERT вставляє рядки відповідно до точно вказаних в команді значень. В дужках після імені таблиці перераховуються стовпці, а після ключового слова VALUES – їх значення.
Наприклад:
mysql> INSERT INTO Persons (last_name, bday) VALUES ('Іванов', '1934');
вставить в таблицю Persons рядок, в якому значення прізвища ( last_name ) і дати народження ( bday ) будуть задані відповідно як "Іванов" і "1934".
Наприклад:
mysql> INSERT INTO Artifacts (author) SELECT id FROM Persons
WHERE last_name='Иванов'
AND bday='1934';
вставить в таблицю Artifacts в полі "автор" ( author ) значення ідентифікатора, вибраного з таблиці Persons по умові, що прізвище людини Іванов і рік народження 1934.
Діють наступні угоди.
Якщо не вказаний список стовпців для INSERT... VALUES або INSERT... SELECT, то величини для всіх стовпців повинні бути визначені в списку VALUES() або в результаті роботи SELECT . Якщо порядок стовпців в таблиці невідомий, для його отримання можна використовувати DESCRIBE ім’я_таблиці.
Будь-який стовпець, для якого явно не вказано значення, буде встановлений в своє значення за умовчанням. Наприклад, якщо в заданому списку стовпців не вказані всі стовпці в даній таблиці, то не згадані стовпці встановлюються в свої значення за умовчанням.
Вираз expression може відноситися до будь-якого стовпця, який раніше був внесений в список значень. Наприклад, можна вказати наступне:
mysql> INSERT INTO ім’я_таблиці (col1,col2) VALUES(15,col1*2);
Ми ще не обговорили три необов'язкові параметри, присутні у всіх трьох формах команди: LOW_PRIORITY, DELAYED і IGNORE.
129
Параметри LOW_PRIORITY і DELAYED використовуються, коли з таблицею працює велике число користувачів. Вони наказують встановлювати пріоритет даної операції перед операціями інших користувачів. Якщо указується ключове слово LOW_PRIORITY, то виконання даної команди INSERT буде затримано до тих пір, поки інші клієнти не завершать читання цієї таблиці. В цьому випадку клієнт повинен чекати, поки дана команда вставки не буде завершена, що у разі інтенсивного використовування таблиці може зажадати значний час. В протилежність цьому команда INSERT DELAYED дозволяє даному клієнту продовжувати операцію зразу ж, незалежно від інших користувачів.
Якщо в команді INSERT указується ключове слово IGNORE, то всі рядки, що мають ключі PRIMARY або UNIQUE, що дублюються, в цій таблиці, будуть проігноровані і не внесені в таблицю. Якщо не указувати IGNORE, то дана операція вставки припиняється при виявленні рядка, що має значення існуючого ключа, що дублюється.
9 Оператор UPDATE
Синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE] ім’я_таблиці
SET ім’я_столбца1=вираз1 [, ім’я_столбца2=вираз2 ...] [WHERE where_definition]
[LIMIT число]
Оператор UPDATE оновлення значення існуючих стовпців таблиці відповідно до введених значень. У виразі SET указується, які саме стовпці слід модифікувати і які величини повинні бути в них встановлені. У виразі WHERE, якщо воно присутнє, задається, які рядки підлягають оновленню. В решті випадків обновляються всі рядки. Якщо заданий вираз ORDER, то рядки обновлятимуться у вказаному в ньому порядку.
Якщо указується ключове слово LOW_PRIORITY, то виконання даної команди UPDATE затримується до тих пір, поки інші клієнти не завершать читання цієї таблиці.
Якщо указується ключове слово IGNORE, то команда оновлення не буде перервана, навіть якщо виникне помилка дублювання ключів. Рядки, через які виникають конфліктні ситуації, оновлені не будуть.
Якщо у виразі, який задає нове значення стовпця, використовується ім'я цього поля, то команда UPDATE використовує для цього стовпця його поточне значення. Наприклад, наступна команда встановлює стовпець death_date в значення, на одиницю більше його поточної величини:
mysql> UPDATE Persons SET death_date=death_date+1;
У версії MySQL 3.23 можна використовувати параметр LIMIT #, щоб переконатися, що була змінена тільки задана кількість рядків.
Наприклад, така операція замінить в першому рядку нашої таблиці експонатів назву title на рядок "Лампова
ЕОМ":
mysql> UPDATE Artifacts SET title='Лампова ЕОМ' Limit 1;
10 Оператор DELETE
Оператор DELETE видаляє з таблиці ім’я_таблиці рядки, що задовольняють заданим в where_definition умовам, і повертає число видалених записів.
Якщо оператор DELETE запускається без визначення WHERE, то віддаляються всі рядки.
Синтаксис:
DELETE [LOW_PRIORITY] FROM ім’я_таблиці
[WHERE where_definition]
130