Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с MySQL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
476.16 Кб
Скачать

Создание таблицы 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

Квартал

QQ

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.