
Создание таблицы authors базы данных forum
Примечание. Символ -> означает продолжение строки запроса. Набирается с клавиатуры он не должен, клиентmysql сам автоматически выставляет его при переходе на другую строку.
Выполнив SQL-команду SHOW TABLES, можно убедиться, что таблица authors успешно создана.
Команда DESCRIBE показывает структуру созданных таблиц и имеет следующий синтаксис:
DESCRIBE table_name;
Здесь table_name — имя таблицы, структура которой запрашивается.
Примечание. Команда DESCRIBE не входит в стандарт SQL и является внутренней командой СУБД MySQL.
Просмотреть структуру таблицы authors можно, выполнив SQL -запрос.
Команда describe
mysql >DESCRIBE authors;
После выполнения этой команды интерпретатор MySQL выведет таблицу.
Примечание. Более полное описание структуры таблицы authors, включающее права доступа и комментарии, можно получить, воспользовавшись оператором SHOW FULL COLUMNS authors;
Аналогичным образом создадим еще несколько небходимых для работы форума таблиц. Следующей по порядку идет таблица forums, в которой содержатся данные о разделах форума.
Примечание. Для удобства на форуме может быть создано несколько различных разделов. К примеру, на форуме, посвященном языкам программирования, чтобы не смешиватьтемы, относящиеся к различным языкам, имеет смысл создать следующие разделы: C++, PHP, JavaScript и т.д.
В таблице forums присутствуют следующие поля:
первичный ключ (id_forum);
название раздела (name);
правила форума (rule);
краткое описание форума (logo);
порядковый номер (pos);
флаг (hide), принимающий значение 'hide', если форум скрытый, и 'show', если он общедоступен.
Coздадим SQL-запрос, создающий таблицу forums.
Создание таблицы forums
Посмотрим структуру таблицы forums.
Структура форума может быть следующей: имеется список разделов, переход по которому приводит посетителя к списку тем раздела. При переходе по теме посетитель приходит к обсуждению этой темы, состоящей из сообщений других посетителей.
Теперь создадим таблицу themes, содержащую темы форума. В таблице создадим следующие поля:
первичный ключ (id_theme);
название темы (name);
автор темы (author);
внешний ключ к таблице авторов (id_author);
флаг (hide), принимающий значение 'hide', если тема скрыта, и 'show', если она отображается (это поле необходимо для модерирования);
время добавления темы (putdate);
внешний ключ к таблице форумов (id_forum), для того чтобы определить, к какому разделу форума относится данная тема.
Создание таблицы themes
Структура таблицы themes
Таблица themes нормализована только частично. Она содержит два внешних ключа: id_author и id_forumдля таблиц посетителей и списка форумов, в то же время в ней дублируется имя автора author, присутствующее также в таблице посетителей authors под именем name. Этот случай является примером умышленной денормализации, необходимой для избежания запроса таблицы авторов, что позволяет обеспечить приемлемую скорость работы форума.
Создадим последнюю таблицу posts в которой будут храниться сообщения. В таблице posts создадим следующие поля:
первичный ключ (id_post);
тело сообщения (name);
необязательная ссылка на ресурс, которую автор сообщения может ввести при добавлении сообщения (url);
путь к файлу, прикрепляемому к сообщению (file);
имя автора (author);
внешний ключ к таблице авторов (id_author);
флаг ('hide'), принимающий значение 'hide', если сообщение скрытое, и 'show', если он отображается (это поле необходимо для модерирования);
время добавления сообщения (putdate);
сообщение, ответом на которое является данное сообщение (parent_post): если это первое сообщение в теме, то поле равно 0;
внешний ключ к теме (id_theme), указывающий, к какой теме относится сообщение.
Создание таблицы posts
Структура таблицы posts
Убедимся, что все таблицы успешно созданы, выполнив команду SHOW TABLES.
Список таблиц базы данных forum
Mы знаем как посмотреть структуру таблицы. Изменить структуру таблицы позволяет оператор ALTER TABLE. С его помощью можно добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу. Оператор имеет следующий синтаксис:
ALTER TABLE table_ name alter_spec
Наиболее часто используемые значения alter_spec приведены в таблице.
Таблица. Основные преобразования, выполняемые оператором ALTER TABLE |
|
Синтаксис |
Описание команды |
ADD create_definition [ FIRST|AFTER column_name] |
Добавляет новый столбец. create_definition представляет собой название нового столбца и его тип. Конструкция FIRSTдобавляет новый столбец перед столбцом column_name; конструкция AFTER — после него. Если место добавления не указано, столбец добавляется в конец таблицы. |
ADD INDEX [index_name] (index_col_name, . . .) |
Добавляет индекс index_name для столбцаindex_col_name. Если имя индекса не указывается, ему присваивается имя, совпадающее с именем столбцаindex_col_name. |
ADD PRIMARY KEY (index_col_name, . . .) |
Делает столбец index_col_name или группу столбцов первым ключем таблицы |
CHANGE old_col_name new_col_name type |
Заменяет столбец с именем old_col_name на столбец с именем new_col_name и типом type |
DROP col_name |
Удаляет столбец с именем col_name |
DROP PRIMARY KEY |
Удаляет первичный ключ таблицы |
DROP INDEX index_name |
Удаляет индекс index_name |
Добавим в таблицу forums новый столбец test разместив его после столбца name.
Добавление столбца в таблицу
Структура таблицы forums после добавления столбца test
Теперь переименуем созданный столбец test в текстовой столбец new_test.
Переименование столбца
Структура таблицы forums после переименования столбца test в new_test
При изменении только типа столбца указание имени все равно необходимо, хотя в этом случае оно будет фактически повторяться.
Изменение типа столбца
Структура таблицы forums после изменения типа столбца
Теперь удалим столбец new_test.
Удаление столбца из таблицы
Структура таблицы forums после удаления столбца new_test
Удаление таблиц MySQL
Оператор DROP TABLE предназначен для удаления одной или нескольких таблиц:
DROP TABLE table_name [, table_name, . . .]
Например, для удаления таблицы forums необходимо выполнить SQL-запрос представленный ниже.
Удаление таблицы forums
Вставка числовых, строковых, календарных и уникальных значений в таблицу. Механизм AUTO_INCREMENT
Вставка числовых значений в таблицу
Для вставки записи в таблицу используется оператор INSERT. Однострочный оператор INSERT может использоваться в нескольких формах. Упрощенный синтаксис первой формы выглядит следующим образом:
INSERT [IGNORE] [INTO] tb1 [(col_name, . . .)] VALUES (expression, . . .)
После оператора VALUES в скобках через запятую перечисляются все значения полей таблицы в соответствии с из типами.
Примечание. При описании синтаксиса операторов ключевые слова, которые не являются обязательными и могут быть опущены, заключаются в квадратные скобки.
Создадим в базе данных wet таблицу tb1, cостоящую из двух числовых столбцов: id, который по умолчанию будет иметь значение 5, и id_cat, который будет принимать по умолчанию значение NULL.
Таблица tb1
Cуществует несколько вариантов использования оператора INSERT, каждый из которых приводит к вставке новой записи.
Вставка записи при помощи оператора INSERT
Проверить результат вставки новых записей в таблицу можно при помощи оператора SELECT, синтаксис которого будет разобран далее.
Просмотр содержимого таблицы tb1
Рассмотрим различные формы оператора INSERT более подробно. Первая форма оператора INSERT вставляет в таблицу tb1 запись (10, 20), столбцы получают значение по порядку из круглых скобок, следующих за ключевым словом VALUES. Если значений в круглых скобках будет больше или меньше, чем столбцов в таблице, то сервер MySQL вернет ошибку Column count doesn't match value count at row 1(Не совпадает количество значений и столбцов в запросе)
.
Порядок занесения значений в запись можно изменить. Для этого следует задать порядок следования столбцов в дополнительных круглых скобках после имени таблицы. Второй оператор INSERT меняет порядок занесения значений: первое значение получает второй столбец id_cat, а второе значение — первый столбец id.
Часть столбцов можно опускать из списка — в этом случае они получают значение по умолчанию. В третьем операторе заполняется лишь поле id, при этом поле id_cat получает значение по умолчанию — NULL.
Четвертый оператор вообще не содержит значений, в этом случае все столбцы таблицы tb1 получат значения по умолчанию, которые определяет ключевое слово DEFAULT. Эффекта последнего оператора можно добиться, если использовать вместо значений ключевое слово DEFAULT.
Использование ключевого слова DEFAULT
Приведенная в первом примере форма оператора INSERT является стандартной и поддерживается всеми СУБД, которые реализуют стандарт SQL. Однако СУБД MySQL поддерживает альтернативный синтаксис оператора INSERT.
Альтернативный синтаксис оператора INSERT
Как видно из листинга, значения присваиваются столбцам при помощи ключевого слова SET; не указанные в операторе столбцы принимают значение по умолчанию.
Просмотр содержимого таблицы
Вставка строковых значений в таблицу
Создадим в базе данных wet таблицу catalogs, которая будет содержать два столбца: числовой столбецid_catalog и текстовой столбец name.
Создание таблицы catalogs
Добавить новую запись в таблицу catalogs можно при помощи запроса представленного ниже.
Добавление новой записи в таблицу catalogs
В таблицу catalogs добавилась новая запись с первичным ключем id_catalog, равным единице, и значением поля name — Процессоры. Строковые значения необходимо помещать в кавычки, в то время как числовые значения допускается использовать без них.
Вместо одиночных кавычек можно использовать двойные кавычки. Когда в текстовое поле необходимо вставить строку, содержащую двойные кавычки, можно использовать для обрамления строки одиночные кавычки и наоборот.
Использование двойных кавычек
В некоторых случаях(например,при использовании одиночных кавычек в качестве обрамляющих и внутри вводимой строки) следует прибегнуть к экранированию внутренних кавычек, т.е. использованию символа \ перед кавычками, включенными в строку
.
Примечание. При помещении в базу данных текста, набранного пользователем, вседа следует экранировать кавычки, для того чтобы предотвратить возникновение ошибки и атаку SQL-инъекций.
Экранирование кавычек
Вставка календарных значений
В общем случае вставка календарных значений мало чем отличается от вставки строк, однако этот тип данных не случайно выделяют в отдельный класс. Создадим таблицу tbl в базе данных wet. Таблица будет содержать числовое поле id и два календарных поля: putdate типа DATETIME и lastdate типа DATE.
Создание таблицы tbl
Вставка календарных значений
Если столбцу передается "лишняя" информация, то она отбрасывается. В нашем примере в столбец типа DATEпередаются часы, минуты и секунды, однако в столбец попадает только информация о дате.
Отбрасывание лишней информации
Зачастую календарные поля предназначены для того, чтобы пометить момент вставки записи в базу данных. Для получения текущего времени удобно воспользоваться встроенной функции MySQL — NOW(). При помощи функции NOW() в таблицу tbl вставляется запись с текущей временной меткой.
Использование функции NOW()
Просмотр содержимого таблицы
Вычисление текущего времени в рамках одного SQL-запроса производится только один раз, сколько бы раз они не вызывались на протяжении данного запроса. Это приводит к тому, что временное значение в рамках всего запроса остается постоянным.
Для получения сдвига даты относительно текущей можно прибавлять и вычитать интервалы. Для этого используется ключевое слово INTERVAL, после которого следует временный интервал.
Использование интервалов
В данном примере в поле putdate помещается дата, эквивалентная 15.03.09 за вычетом 3 недель, а в поле lastdate помещается дата, равная текущей плюс 3 месяца.
Интервалы могут быть различного типа. Полный список допустимых интервалов приводится в ниже следующей таблице.
Тип |
Описание |
Формат ввода |
MICROSECOND |
Микросекунды |
хххххх |
SECOND |
Секунды |
ss |
MINUTE |
Минуты |
mm |
HOUR |
Часы |
hh |
DAY |
Дни |
DD |
WEEK |
Недели |
WW |
MONTH |
Месяцы |
MM |
QUARTER |
Квартал |
|
YEAR |
Год |
YY |
SECOND_MICROSECOND |
Секунды и микросекунды |
'ss.xxxxxx' |
MINUTE_MICROSECOND |
Минуты, секунды и микросекунды |
'mm:ss.xxxxxx |
MINUTE_SECOND |
Минуты и секунды |
'mm:ss' |
HOUR_MICROSECOND |
Часы, минуты, секунды, микросекунды |
'hh:mm:ss.xxxxxx' |
HOUR_SECOND |
Часы, минуты, секунды |
'hh:mm:ss' |
HOUR_MINUTE |
Часы и минуты |
'hh:mm' |
DAY_MICROSECOND |
Дни, часы, минуты, секунды и микросекунды |
'DD hh:mm:ss.xxxxxx' |
DAY_SECOND |
Дни, часы, минуты и секунды |
'DD hh:mm:ss' |
DAY_MINUTE |
Дни, часы, минуты |
'DD hh:mm' |
DAY_HOUR |
Дни и часы |
'DD hh' |
YEAR_MONTH |
Года и месяцы |
'YY-MM' |
Вставка уникальных значений
Первичный ключ таблицы (PRIMARY KEY) или столбец, индексированный уникальным индексом (UNIQUE), не могут иметь повторяющихся значений. Вставка записи со значением, уже имеющимся в таблице, приводит к возникновению ошибки. Для чистоты "эксперемента" создадим в базе данных wet новую таблицу tb2
. Значения первичного ключа должны быть уникальными
Для того, чтобы новые записи с дублирующим ключем отбрасывались без генерации ошибки, следует добавить после оператора INSERT ключевое слово IGNORE.