Команды SQL часть2
Следующей по порядку идет таблица forums, в которой содержатся данные о разделах форума.
Примечание
Для удобства на форуме может быть создано несколько различных разделов. К примеру, на форуме по языкам программирования для того, чтобы не смешивать темы, относящиеся к различным языкам, имеет смысл создать следующие разделы: С++, PHP, Java и т. д.
В таблице forums присутствуют следующие поля: первичный ключ (id_forum), название раздела (name), правила форума (rule), краткое описание форума (logo), порядковый номер (pos), флаг, принимающий значение 1, если форум скрытый и 0, если общедоступный (hide).
Вот SQL-запрос, создающий таблицу forums
mysql> CREATE TABLE forums (
id_forum int(6) NOT NULL auto_increment,
name text,
rule text,
logo text,
pos int(6) default NULL,
hide int(1) default NULL,
PRIMARY KEY (id_forum)
) TYPE=MyISAM;
Структура форума может быть следующей: имеются список разделов, переход по которым приводит посетителя к списку тем раздела. При переходе по теме посетитель приходит к обсуждению этой темы, состоящих из сообщений других посетителей. Теперь создадим таблицу themes, содержащую темы форума:
mysql> CREATE TABLE themes (
id_theme int(11) NOT NULL auto_increment,
name text,
author text,
id_author int(6) default NULL,
hide int(1) default NULL,
time datetime default NULL,
id_forum int(2) default NULL,
PRIMARY KEY (id_theme)
) TYPE=MyISAM;
В таблице themes присутствуют следующие поля: первичный ключ (id_theme), название темы (name), автор темы (author), внешний ключ к таблице авторов (id_author), флаг, принимающий значение 1, если тема отмечена скрытой и 0, если отображается (hide) - это поле необходимо для модерирования, время добавления темы (time), внешний ключ к таблице форумов (id_forum), для того чтобы определить к какому разделу форума относится данная тема.
В таблице themes нормализация проведена частично, она содержит два внешних ключа: id_author и id_forum для таблиц посетителей и списка форумов, в тоже время в ней дублируется имя автора author, присутствующее также в таблице посетителей authors под именем name. Этот случай является примером денормализации предназначенной для того, чтобы не запрашивать каждый раз таблицу авторов при выводе списка тем и их авторов, чтобы обеспечить приемлемую скорость работы форума.
Создадим последнюю таблицу posts, в которой хранятся сообщения:
mysql> CREATE TABLE posts (
id_post int(11) NOT NULL auto_increment,
name text,
url text,
file text,
author text,
id_author int(6) default NULL,
hide int(1) default NULL,
time datetime default NULL,
parent_post int(11) default NULL,
id_theme int(11) default NULL,
PRIMARY KEY (id_post)
) TYPE=MyISAM;
В таблице posts присутствуют следующие поля: первичный ключ (id_post), тело сообщения (name), необязательная ссылка на ресурс, которую автор сообщения может ввести при добавлении сообщения (url), путь к файлу прикрепляемому к сообщению (file), имя автора (author), внешний ключ к таблице авторов (id_author), флаг, принимающий значение 1, если сообщение отмечено как скрытое и 0, если он отображается (hide) - это поле необходимо для модерирования, время добавления сообщения (time), сообщение ответом на которое является данное сообщение (parent_post), если это первое сообщение в теме - это поле равно 0, внешний ключ к тем (id_theme), для того чтобы определить к какой теме относится сообщение.
Убедимся, что все таблицы успешно созданы, выполнив команду SHOW TABLES (рис.)
DESCRIBE
Команда DESCRIBE показывает структуру созданных таблиц и имеет следующий синтаксис:
DESCRIBE tаble_name
Здесь tаble_name - имя таблицы структура которой запрашивается.
Замечание
Команда DESCRIBE не входит в стандарт SQL и является внутренней командой СУБД MySQL.
Давайте посмотрим, к примеру, структуру таблицы forums, выполнив следующий SQL-запрос:
mysql< DESCRIBE forums;
После выполнения этой команды, интерпретатор mysql выведет следующую таблицу
ALTER TABLE
Команда ALTER TABLE позволяет изменить структуру таблицы. Эта команда позволяет добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу. Команда имеет следующий синтаксис:
ALTER TABLE table_name alter_spec
Параметр alter_spec имеет значения, представленные в таблице
Синтаксис | Описание команды |
ADD create_definition [FIRST|AFTER column_name] | Добавление нового столбца create_definition. create_definition представляет собой название нового столбца и его тип. Конструкция FIRST добавляет новый столбец перед столбцом column_name. Конструкция AFTER добавляет новый столбец после столбца column_name. Если место добавления не указано, по умолчанию столбец добавляется в конец таблицы. |
ADD INDEX [index_name] (index_col_name,...) | Добавление индекса index_name для столбца index_col_name. Если имя индекса index_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. |
mysql> ALTER TABLE forums ADD test int(10) AFTER name;
Выполнив команду DESCRIBE forums, можно увидеть, что столбец test успешно добавлен после столбца name
Давайте переименуем созданный столбец test в текстовый столбец new_test
mysql>ALTER TABLE forums CHANGE test new_test text;
Как видно из рисунка, столбец успешно переименован: (рис.)