Безопасность систем баз данных. Учебное пособие
.pdfQuery OK, 3 rows affected, 2 warnings (0.01
sec)
Records: 3 Duplicates: 0 Warnings: 2
Теперь изменим значение id для первой строки:
mysql> UPDATE mytime SET id=4 WHERE id=1;
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Видно, что временная метка обновляется текущим време-
нем.
Существуют и другие методы управления автоматическим обновлением столбцов, однако если следовать предыдущим инструкциям, то получим требуемое поведение.
CHAR[(ширина)]. Чаще всего используемый строковый тип. Тип CHAR хранит строку фиксированнойширины (например, имя, адрес или название города). Если ширина не указана, то будет использоваться CHAR(1). Максимальное значение ширины составляет 255 символов. В версиях с 4.1.0 по 5.0.2 MySQL принимает значения больше 255 и молча заменяет тип CHAR самым маленьким подходящим типом TEXT.
Можно определить специальный столбецCHAR(0) NULL, требующий только один бит для хранения. Таким образом, получим две удобные возможности. Во-первых, это позволяет включить в таблицу фиктивный столбец без каких-либо функций(он может стать «заполнителем» для будущих дополнений или использоваться для обеспечения совместимости со старым приложением). Во-вторых, это позволяет хранить одно из двух значений: NULL или пустую строку (‘’) для очень компактного хранения двоичных (булевых) значений.
Другие целочисленные типы
Кроме описанного выше типаINT, предназначенного для хранения целых чисел, существуют и другие целочисленные типы, которые будут рассмотрены в этом разделе. Для хранения значений мы рекомендуем всегда выбирать самые маленькие типы. Например, если вам нужно сохранить значение возраста, выберите вместо стандартногоINT тип TINYINT. Более маленькие типы требуют меньше места для хранения, позволяя смягчить требования относительно дискового пространства и памяти,
131
также ускорить извлечение данных с диска. Настройка типа столбца является ключевым этапом, который применяют профессиональные настройщики баз данных для оптимизации приложений.
Представляя далее список целочисленных типов, хотим обратить ваше внимание, что к ним применяются те же основные правила, что и к типу INT.
BOOLEAN. Введенный в версии MySQL 4.1, этот тип хранит булево значение false (нуль) или true (не нуль). Например, его можно использовать для хранения данных о персоне— жив он (true) или уже умер(false), активности (true) или пассивности (false) клиента, либо его желании (true) или нежелании (false) получать письма по электронной почте. Тип BOOLEAN имеет синонимы BOOL и BIT. Он эквивалентен типу TINYINT(1) и требует один байт для хранения. Можно получить более компактные однобитные булевы значения с помощью типаCHAR(0), описанного ранее.
TINYINT [(ширина)] [UNSIGNED] [ZEROFILL]. Хранит целочисленные значения в диапазоне от-128 до 127. Атрибуты ширина, UNSIGNED и ZEROFILL ведут себя точно так же, как и в случае с типомINT. При использовании атрибутаUNSIGNED столбец может хранить значения в диапазоне от 0 до 255. Значение типа TINYINT требует один байт для хранения.
SMALLINT [(ширина)] [UNSIGNED] [ZEROFILL]. Хра-
нит целочисленные значения в диапазоне от-32 768 до 32 767. Атрибуты ширина, UNSIGNED и ZEROFILL ведут себя точно так же, как и в случае с типом INT. При использовании атрибута UNSIGNED столбец может хранить значения в диапазоне от 0 до 65 535. Значение типа SMALLINT требует два байта для хранения.
MEDIUMINT [(ширина)] [UNSIGNED] [ZEROFILL].
Хранит целочисленные значения в диапазоне от-8 388 608 до 8 388 607. Атрибуты ширина, UNSIGNED и ZEROFILL ведут себя точно так же, как и в случае с типом INT. При использовании атрибута UNSIGNED столбец может хранить значения от 0 до 16 777 215. Значение типа MEDIUMINT требует три байта для хранения.
132
BIGINT [(ширина)] [UNSIGNED] [ZEROFILL]. Хранит целочисленные значения в диапазоне-9 223 372 036 854 775 808
до 9 223 372 036 854 775 807. Атрибуты ширина, UNSIGNED и ZEROFILL ведут себя точно так же, как и в случае с типом INT. При использовании атрибута UNSIGNED столбец может хранить значения в диапазоне от 0 до 18 446 744 073 709 551 615. Значение типа BIGINT требует для хранения восемь байтов.
Другие рациональные числовые типы
DOUBLE (также известный как REAL) и FLOAT. Они предназначены для хранения приближенных числовых значений в отличие от типаDECIMAL, использующегося для хранения точных значений. Для чего нужны приближенные значения? Ответ следующий: большое количество знаков после запятой позволяет аппроксимировать реальные числа.
Предположим, что при заработке50 000 долларов в год нужно распределить эту сумму по месяцам. После преобразования в ежемесячную зарплату получим 4 166 долларов и 2/3 цента. Сохранить это число как 4 166,67 будет не совсем точно, поскольку при перемножении чисел4 166,67 и 12 получится годовой оклад в 50 000,04 доллара. Однако если сохранить 2/3 с достаточным количеством знаков после запятой, то получим более точное приближение, при перемножении которого в такой высокоточной среде, как MySQL будет получено исходное значение. Для подобных случаев и используются типыDOUBLE и FLOAT, поскольку они позволяют хранить такие значения, как 2/3 от числа, т.е. с большим количеством знаков после запятой, а также разрешают корректно представлять приближенные значения точных величин.
10.3. Работа с таблицами в MySQL
Для добавления нового столбца в таблицу, удаления существующих столбцов и изменения имен, типов и длины столбцов используется инструкция ALTER TABLE.
Начнем с модификации существующих столбцов. Рассмотрим пример переименования столбца таблицы. В таблице gruppirovka есть столбец с именемgruppirovka_name. Чтобы изменить
133
имя этого столбца на gruppurovka_nazvanie, воспользуемся следующей инструкцией:
mysql> ALTER TABLE gruppirovka CHANGE gruppirovka_name gruppirovka_nazvanie CHAR(128);
Query OK, 7 rows affected (0.03 sec) Records: 7 Duplicates: 0 Warnings: 0
Может показаться, что MySQL обрабатывает и изменяет каждую строку. На самом деле MySQL создает новую таблицу с новой структурой, копирует данные в эту таблицу, удаляет исходную таблицу gruppirovka и присваивает новой таблице имя gruppirovka. Можно проверить результат с помощью инструкции
SHOW COLUMNS:
В предыдущем примере обеспечили для инструкции ALTER TABLE четыре параметра вместе с ключевым словом CHANGE.
Имя таблицы gruppirovka.
Исходное имя столбца gruppirovka_name.
Новое имя столбца gruppirovka_nazvanie.
Тип столбца CHAR(128).
Нужнобеспечить все четыре параметра, то есть повторно определить тип и все выражения.
Чтобы переименовать столбец gruppirovka_name на gruppi- rovka-name, используется инструкция:
ALTER TABLE gruppirovka CHANGE gruppirovka_name gruppirovka-name CHAR(128) DEFAULT NULL;
Для модификации типа и выражений для столбца без изменения имени используется ключевое слово MODIFY:
mysql> ALTER TABLE gruppirovka MODIFY
-> gruppirovka_name |
CHAR(64) |
-> DEFAULT "Unknown"; |
|
Query OK, 7 rows affected (0.01 sec) |
|
Records: 7 Duplicates: 0 Warnings: 0 |
|
С этой целью можно |
применить и ключевое слово |
CHANGE, однако тогда придется дважды указывать одно и то же имя столбца:
134
mysql> ALTER TABLE gruppirovka CHANGE gruppirovka_name
-> gruppirovka_name CHAR(64) DEFAULT
"Unknown";
Query OK, 7 rows affected (0.03 sec) Records: 7 Duplicates: 0 Warnings: 0
Модифицируя типы, нельзя делать следующее:
• использовать несовместимые типы, чтобы сервер MySQL мог успешно преобразовать один тип данных в другой (например, вряд ли понравится преобразование столбцаINT B столбец
DATETIME);
• обрезать данные, если в этом нет необходимости. После уменьшения значения атрибута ширина значения будут редактироваться в соответствии с новым значением этого атрибута, что может привести к потере данных.
Предположим, необходимо добавить в существующую таблицу дополнительный столбец. С помощью инструкции ALTER TABLE это делается так:
mysql> ALTER TABLE gruppirovka ADD gruppirovka_nomer int(3);
Query OK, 7 rows affected (0.02 sec) Records: 7 Duplicates: 0 Warnings: 0
Следует предоставить ключевое словоADD, имя и тип нового столбца, а также выражения. В этом примере добавляется новый столбец gruppirovka_nomer в качестве последнего столбца таблицы, что можно выяснить с помощью инструкции
SHOW COLUMNS.
Если нужно, чтобы новый столбец был первым в таблице, используется ключевое слово FIRST:
mysql> ALTER TABLE gruppirovka ADD gruppirovka_nomer
-> int(3)FIRST;
Query OK, 7 rows affected (0.02 sec) Records: 7 Duplicates: 0 Warnings: 0
При необходимости вставить столбец в специфическую позицию применяйте ключевое слово AFTER:
135
mysql> ALTER TABLE gruppirovka ADD gruppirovka_nomer INT(3)
-> AFTER gruppirovka_id;
Query OK, 7 rows affected (0.03 sec) Records: 7 Duplicates: 0 Warnings: 0
Для удаления столбца используйется ключевое слово DROP перед именем столбца. В следующем примере удалим но-
вый столбец formed:
mysql> ALTER TABLE gruppirovka DROP gruppirovka_nomer;
Query OK, 7 rows affected (0.02 sec) Records: 7 Duplicates: 0 Warnings: 0
Эта инструкция удаляет столбец и все содержащиеся в нем данные. Кроме того, столбец удаляется из всех индексов. Если индекс состоит только из этого столбца, он также удаляется. Нельзя удалить столбец, если он является единственным в -та блице. Для этого нужно сбросить саму таблицу, как описано далее, в разделе «Удаление баз данных и таблиц». Будьте осторожны, удаляя столбцы, поскольку вы сбрасываете и данные, и структуру таблицы. Изменяя структуру таблицы, обычно модифицируют все инструкцииINSERT, используемые для вставки значений в отдельном порядке.
Сервер MySQL позволяет указывать в одной инструкции ALTER TABLE множество изменений, разделенных запятыми. Далее представлен пример добавления нового столбца и изменения другого:
mysql> ALTER TABLE gruppirovka ADD -> gruppirovka_nomer
-> INT(3), MODIFY gruppirovka_name -> char(256);
Query OK, 6 rows affected, 1 warning (0.08 sec) Records: 6 Duplicates: 0 Warnings: 0
Эффективное объединение множества модификаций в одной операции позволяет быстро создать новую таблицу, скопировать данные из старой таблицы в новую, сбросить старую таблицу и задать новой таблице имя старой для каждой модификации отдельно.
136
Переименование таблиц
После обсуждения методов модификации столбцов и -ин дексов в таблице можно приступить к модификации самих таблиц. Это сделать несложно. Предположим, что нужно переиме-
новать таблицу gruppirovka на prestupnaya_gruppirovka. Исполь-
зуйте следующую инструкцию:
mysql> ALTER TABLE gruppirovka RENAME TO -> prestupnaya_gruppirovka;
Query OK. 0 rows affected (0.00 sec)
Ключевое слово TO является опциональным.
С помощью инструкцийALTER можно также выполнять следующие операции.
Изменять набор символов и порядок сопоставления по умолчанию для базы данных, таблицы или столбца.
Изменять способ организации строк в таблице. Это удобно, если нужен доступ к строкам в определенном порядке и хотим таким же образом извлекать данные.
Управлять и изменять ограничения. Например, можно добавлять и удалять внешние ключи.
Начиная с версии MySQL 5.1, также можно изменять имя базы данных с помощью инструкции RENAME DATABASE:
mysql> RENAME DATABASE
имя_старой_базы_данных имя_новой_данных;
Query OK, 0 rows affected (0.01 sec)
Удаление баз данных
Удалить, или сбросить, базу данных не составляет труда. В следующем примере сбрасим БД prestupnost:
mysql> DROP DATABASE prestupnost;
Query OK. 3 rows affected (0.01 sec)
Количество строк, возвращаемых в результатах, равно количеству удаленных таблиц. Следует проявлять осторожность при сбросе базы данных, поскольку при этом удаляются все таблицы, индексы и столбцы, а также все связанные с ней файлы и папки на диске, которые сервер MySQL использовал для поддержки БД.
137
Попытка сбросить несуществующую базу данных вызовет ошибку. Попробуем вновь сбросить базу данных prestupnost:
mysql> DROP DATABASE prestupnost;
ERROR 1008 (HY000): Can't drop database 'prestupnost'; database doesn't exist
Этой ошибки можно избежать с помощью ключевой фразы IF EXISTS, что удобно при включении инструкции в сценарий:
mysql> DROP DATABASE IF EXISTS prestupnost;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Предупреждение все же выводится, поскольку база данных prestupnost уже была сброшена. Можно просмотреть это предупреждение с помощью инструкцииSHOW WARNING, которая появилась в версии MySQL 4.1.0.
Если вы не включите в инструкцию ключевую фразуIF EXISTS, то вместе с предупреждением будет сгенерировано -со общение об ошибке.
Удаление таблиц
Удалять таблицы так же просто, как и базы данных. В следующем примере создадим и удалим таблицу из базы данных prestupnost:
mysql> CREATE TABLE temp (temp INT(3),
PRIMARY KEY (temp));
Query OK, 0 rows affected (0.00 sec) mysql> DROP TABLE temp;
Query OK. 0 rows affected (0.00 sec)
Сообщение 0 rows affected ошибочно. Таблица действительно была создана и удалена.
Для предотвращения ошибок следует использовать ключевую фразу IF EXISTS. Попытаемся вновь сбросить таблицу temp:
mysql> DROP TABLE IF EXISTS temp;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Можно сбросить сразу несколько таблиц, указав их имена в одной инструкции и разделив их запятыми:
mysql> DROP TABLE IF EXISTS temp, tempi, temp2;
138
Query OK, 0 rows affected, 3 warnings (0.00
sec)
При удалении любых структур необходимо создать резервные копии бызы данных, которые позволят восстановить утраченные данные в результате ошибочных действий.
Контрольные вопросы
1.Какие наборы символов MySQL?
2.Каково назначение типа данных INT?
3.Каково назначение типа данных DECIMAL?
4.Каково назначение типа данных DATE?
5.Каково назначение типа данных TIME?
6.Каково назначение типа данных TIMESTAMP?
7.Каково назначение типа данных CHAR?
8.Каково назначение типа данных BOOLEAN?
9.Каково назначение типа данных TINYINT, SMALLINT, MEDIUMINT?
139
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Основной
Гольцман, В. MySQL 5.0 Библиотека программиста [Текст] / В. Гольцман.- СПб. : Питер, 2010. – 256 с.
Кирилов, В. В. Введение в реляционные базы данных[Текст] / В. В. Кирилов, Г. Ю. Громов. – СПб. : БХВ-Питербург, 2012. – 464 с.
Ждамиров, В. И. Основы информационных технологий [Текст] : учеб. пособие / В. И. Ждамиров. – Воронеж: Воронеж. ин-т МВД России, 2012. –260 с.
Дополнительный
Информационные системы [Текст] : учебник для вузов / Ю. С. Избачков, В. Н. Петров, А. А. Васильев, И. С. Телина. 3-е
изд.– СПб. : Питер, 2011. –544 с.
Пирогов, В. Информационные системы и базы данных [Текст] / В. Пирогов. – СПб. : Питер, 2011. – 528 с.
Мотев, А. Уроки MySQL [Текст] / А. Мотев. – СПб. : БВХ-
Петербург, 2012. – 208 с.
Васвани, В. MySQL: использование и администрирование [Текст] / В. Васвани. – СПб. : Питер, 2011. – 368 с.
140
