Создает таблицу
CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [имя_базы_данных .]имя_таблицы (определение_столбца [, определение_столбца]*[, ограничение]*)CREATE [TEMP | TEMPORARY] TABLE [имя_базы_данных .]имя_таблицы AS оператор_selectопределение_столбца = имя [тип] [[CONSTRAINT имя] ограничение_столбца]*тип = название_типа |название_типа ( число ) |название_типа ( число, число )определение_столбца = NOT NULL [условие_конфликта] |PRIMARY KEY [порядок_сортировки] [условие_конфликта] [AUTOINCREMENT] |UNIQUE [условие_конфликта] |CHECK ( выражение ) |DEFAULT значение |COLLATE имя_сортировкиconstraint = PRIMARY KEY ( список_столбцов ) [условие_конфликта] |UNIQUE ( список_столбцов ) [условие_конфликта] |CHECK ( выражение ) [условие_конфликта]условие_конфликта = ON CONFLICT алгоритм_разрешения_конфликта
CREATE TABLE содержит ключевые слова CREATE TABLE, за которыми следуют имя новой таблицы и заключенный в скобки список определений столбцов и ограничений. В качестве имени таблицы может использоваться идентификатор или строка. Имена таблиц с префиксом sqlite_ зарезервированы для использования существующими СУБД.
Каждое определение столбца состоит из имени, типа данных и одного или нескольких ограничений. В столбце можно хранить данные, тип которых отличается от типа, указанного в его определении (подробнее см. в главе Типы данных QDB). Каждое ограничение UNIQUE создает индекс указанных столбцов, который должен содержать уникальные ключи. Ограничение COLLATE определяет, какая Пользовательский порядок сортировки используется при сравнении текстовых записей столбца. По умолчанию применяется встроенная функция сортировки BINARY.
Ограничение DEFAULT задает значение по умолчанию, которое применяется к столбцу при выполнении оператора INSERT. В качестве значения по умолчанию можно указывать NULL
, строковую константу, число, а также одно из специальных ключевых слов CURRENT_TIME, CURRENT_DATE и CURRENT_TIMESTAMP (в любом регистре). Значение NULL
, строковая константа или число вставляются в столбец при выполнении каждого оператора INSERT, в котором не указано значение для столбца.
Если указано одно из специальных ключевых слов CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP, в столбец вставляются текущие дата и/или время согласно всемирному скоординированному времени. CURRENT_TIME имеет формат ЧЧ:ММ:СС, CURRENT_DATE — формат ГГГГ-ММ-ДД, CURRENT_TIMESTAMP — формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.
При использовании ограничения PRIMARY KEY обычно создается уникальный индекс для соответствующих столбцов, но если это ограничение применяется к единственному столбцу типа INTEGER
, он становится фактическим внутренним ключом B-дерева таблицы. Этот столбец может содержать только уникальные целочисленные значения (во всех остальных случаях QDB игнорирует типы данных, которые указаны в определениях столбцов, и позволяет записывать в них любые данные).
Если в таблице отсутствует столбец INTEGER
PRIMARY KEY, в качестве ключа B-дерева используется автоматически сгенерированное целое число. Для доступа к ключу B-дерева строки можно использовать специальные имена "ROWID", "OID" и "_ROWID_" независимо от наличия столбца INTEGER
PRIMARY KEY. В столбце INTEGER
PRIMARY KEY также можно указывать ключевое слово AUTOINCREMENT, которое изменяет метод автоматической генерации ключей B-дерева службой QDB. Дополнительную информацию об автоматической генерации ключей B-дерева см. Идентификаторы строк (ROWID) и автоматическое инкрементирование.
Согласно стандарту SQL, в столбце PRIMARY KEY не допускается наличие значений NULL
, однако из-за устоявшейся ошибки в коде библиотека sqlite позволяет указывать значения NULL
в столбцах PRIMARY KEY. Возможно, это нарушение будет устранено в будущем, но на момент обнаружения ошибки библиотека sqlite была настолько популярной, что было принято решение не подвергать ее риску и не вносить исправления в написанный код. Таким образом, на сегодняшний день можно записывать значения NULL
в столбцы PRIMARY KEY, однако разработчикам рекомендуется создавать новые программы с учетом того, что библиотека sqlite может быть приведена в соответствие со стандартом SQL.
Если при создании таблицы указано ключевое слово TEMP или TEMPORARY, таблица видима только в пределах соответствующего подключения к базе данных и автоматически удаляется при его закрытии. Все индексы временной таблицы также являются временными. Временные таблицы и индексы хранятся в специальном файле отдельно от главной базы данных.
Если указан параметр база_данных, представление создается в базе данных с заданным именем. Не допускается одновременное использование параметра база_данных и ключевог слова TEMP, если значение параметра база_данных не равно temp. Если имя базы данных и ключевое слово TEMP не указаны, таблица создается в главной базе данных.
Необязательный параметр алгоритм_разрешения_конфликтов позволяет задавать альтернативный алгоритм разрешения конфликтов для ограничения; по умолчанию применяется алгоритм ABORT. Ограничения одной таблицы могут иметь разные алгоритмы разрешения конфликтов. Если команде COPY, INSERT или UPDATE назначен особый алгоритм разрешения конфликтов, он используется вместо алгоритма по умолчанию, который указан в операторе CREATE TABLE. Дополнительную информацию см. в разделе SQL: ON CONFLICT.
На сегодняшний день QDB поддерживает и применяет ограничения CHECK.
Таблица может иметь произвольное количество столбцов, ограничений и данных в строке.
Форма CREATE TABLE AS создает таблицу из множества результатов запроса. В качестве имен ее столбцов используются имена столбцов результата.
Текст оператора CREATE TABLE хранится в таблице sqlite_master. При каждом открытии базы данных все операторы CREATE TABLE считываются из нее и используются для восстановления внутреннего представления структуры страницы в QDB. Если в качестве исходной команды использовался оператор CREATE TABLE AS, вместо него создается и сохраняется в таблице sqlite_master эквивалентный оператор CREATE TABLE. Текст операторов CREATE TEMPORARY TABLE хранится в таблице sqlite_temp_master.
Если указано необязательное условие IF NOT EXISTS и существует еще одна таблица с таким же именем, эта команда не выполняет никаких действий.
Для удаления таблиц используется оператор SQL: DROP TABLE.
Выражения в SQL запросах, Ключевые слова, поддерживаемые QDB
Предыдущий раздел: перейти