Базовая информация по таблицам

Таблица в реляционной базе данных очень похожа на таблицу на бумаге: она состоит из строк и столбцов. Количество и порядок столбцов фиксированы, и у каждого столбца есть имя. Количество строк переменно — оно отражает, сколько данных хранится в данный момент. SQL не дает никаких гарантий относительно порядка строк в таблице. Когда таблица прочитывается, строки появятся в произвольном порядке, если только сортировка не задана явно. Подробнее это освещается в главе Запросы. Кроме того, SQL не присваивает строкам уникальные идентификаторы, поэтому в таблице может быть несколько полностью идентичных строк. Это следствие математической модели, лежащей в основе реляционных СУБД, но обычно такое дублирование нежелательно. Далее в этой главе мы увидим, как бороться с этой проблемой.

Каждый столбец имеет тип данных. Тип данных ограничивает набор возможных значений, которые могут быть назначены столбцу, и определяет семантику хранящихся в столбце данных, чтобы их можно было использовать для вычислений. Например, столбец, объявленный как имеющий числовой тип, не будет принимать произвольные текстовые строки, а данные, хранящиеся в таком столбце, можно использовать для математических вычислений. И наоборот, столбец с типом символьной строки будет принимать практически любые данные, но не подлежит математическим вычислениям, хотя другие операции, например, конкатенация строк, для него доступны.

QHB включает в себя значительный набор встроенных типов данных, которые подходят для многих приложений. Кроме того, пользователи могут определять свои собственные типы данных. Большинство встроенных типов данных имеет очевидные имена и семантику, поэтому подробное их рассмотрение отложим до главы Типы данных. Некоторые из часто используемых типов данных: integer для целых чисел, numeric для возможно дробных чисел, text для символьных строк, date для дат, time для значений времени суток и timestamp для значений, содержащих и дату, и время.

Для создания таблицы используется, соответственно, команда CREATE TABLE. В этой команде следует указать как минимум имя новой таблицы, имена столбцов и тип данных каждого столбца. Например:

CREATE TABLE my_first_table (
    first_column text,
    second_column integer
);

Это создает таблицу с именем my_first_table с двумя столбцами. Первый столбец называется first_column и имеет тип данных text, второй — second_column с типом integer. Имена таблиц и столбцов соответствуют синтаксису идентификатора, описанному в подразделе Идентификаторы и ключевые слова. Имена типов обычно тоже являются идентификаторами, но есть некоторые исключения. Обратите внимание, что список столбцов разделен запятыми и заключен в скобки.

Конечно, предыдущий пример был крайне надуманным. Обычно таблицам и столбцам дают имена, отражающие вид данных, которые они хранят. Итак, давайте взглянем на более реалистичный пример:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

(тип numeric может хранить дробные компоненты, что типично для денежных сумм).

Совет
Когда создается много взаимосвязанных таблиц, разумно выбрать единый шаблон именования таблиц и столбцов. Например, можно решить, использовать ли для имен таблиц существительные в единственном или множественном числе (у обоих вариантов есть свои сторонники).

Существует ограничение на количество столбцов в таблице. В зависимости от типов столбцов оно колеблется от 250 до 1600. Однако определение таблицы с таким количеством столбцов весьма необычно и часто бывает признаком сомнительного дизайна.

Если таблица больше не нужна, ее можно удалить с помощью команды DROP TABLE. Например:

DROP TABLE my_first_table;
DROP TABLE products;

Попытка удалить несуществующую таблицу является ошибкой. Тем не менее в файлах скриптов SQL принято удалять каждую таблицу перед ее созданием, игнорируя любые сообщения об ошибках, чтобы скрипт работал независимо от того, существует таблица или нет. (При необходимости можно воспользоваться вариантом DROP TABLE IF EXISTS, чтобы избежать сообщений об ошибках, но это не стандартный SQL).

Изменение таблицы, которая уже существует, рассматривается далее в этой главе в разделе Изменение таблиц.

Используя описанные выше инструменты, можно создавать полностью функциональные таблицы. Остальная часть этой главы посвящена дополнительным возможностям в определении таблицы, обеспечивающим целостность, безопасность или удобство. Если вы хотите заполнить ваши таблицы данными прямо сейчас, можно сразу перейти к главе Манипулирование данными и прочитать остальную часть этой главы позже.