MyTetra Share
Делитесь знаниями!
SQLite3, CREATE TABLE (Создание таблицы)
Время создания: 25.12.2012 11:55
Текстовые метки: sqlite, sqlite3
Раздел: Компьютер - Программирование - SQL - SQLite3
Запись: xintrea/mytetra_syncro/master/base/1356422142al0jop0ts2/text.html на raw.github.com

CREATE TABLE

sql-command ::=

CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name .] table-name (

column-def [, column-def]*

[, constraint]*

)

sql-command ::=

CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement

column-def ::=

name [type] [[CONSTRAINT name] column-constraint]*

type ::=

typename |

typename ( number ) |

typename ( number , number )

column-constraint ::=

NOT NULL [ conflict-clause ] |

PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |

UNIQUE [ conflict-clause ] |

CHECK ( expr ) |

DEFAULT value |

COLLATE collation-name

constraint ::=

PRIMARY KEY ( column-list ) [ conflict-clause ] |

UNIQUE ( column-list ) [ conflict-clause ] |

CHECK ( expr )

conflict-clause ::=

ON CONFLICT conflict-algorithm

В команде CREATE TABLE за ключевым словом "CREATE TABLE" обычно следует имя таблицы и список определений полей и условий. Имя таблицы может быть как идентификатором, так и строкой. Имена, начинающиеся с "sqlite_" зарезервированы для использования движком.

Каждое определение поля таблицы состоит из его имени, типа и одним или несколькими дополнительными условиями. Тип данных для поля, не ограничивает размещение в нем данных. Для дополнительной информации смотрите Типы данных в SQLite версии 3. Ограничение UNIQUE вызывает создание индекса на заданных полях. Оператор COLLATE определяет для функцию сравнения, которая будет использоваться для этого поля. По умолчанию применяется встроенная функция BINARY.

Условие DEFAULT определяет значение по умолчанию, которое используется при вставке INSERT. Значение может быть NULL, строковой константой или числом. Начиная с версии 3.1.0, значение по умолчанию, может также принимать специальные ключевые слова CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP. Если значение NULL, строка или число, оно вставляется без изменений в поле, если в команде INSERT не определено значение для этого поля. Если значение CURRENT_TIME, CURRENT_DATE или CURRENT_TIMESTAMP, тогда текущая UTC дата и/или время вставляются в поля. Для CURRENT_TIME, формат HH:MM:SS. Для CURRENT_DATE, YYYY-MM-DD. Формат для CURRENT_TIMESTAMP - "YYYY-MM-DD HH:MM:SS".

Определение PRIMARY KEY обычно просто создает индекс UNIQUE на заданных полях. Однако, если первичный ключ на одном столбце имеет тип INTEGER, тогда этот столбец будет использоваться внутри как реальный ключ для B-Дерева (B-Tree) таблицы. Это означает, что поле может содержать только уникальное целое значение. (Исключение в одном случае, SQLite игнорирует типы данных полей и позволяет хранить данные любого типа, независимо от их описания.) Если таблица не имеет поля с INTEGER PRIMARY KEY, тогда целый ключ B-Дерева (B-Tree) будет создан автоматически. Доступ к ключу B-Tree записи всегда можно получить, используя специальные имена "ROWID", "OID", или "_ROWID_". Это верно независимо от наличия INTEGER PRIMARY KEY. После INTEGER PRIMARY KEY также может содержать ключевое слово AUTOINCREMENT. Ключевое слово AUTOINCREMENT изменяет способ автоматической генерации B-Tree. Дополнительная информация о автоматической генерации B-Tree доступна отдельно.

В соответствии со стандартом SQL, PRIMARY KEY подразумевает NOT NULL. К сожалению, по давнему недосмотру, это не так в случае SQLite. SQLite допускает значения NULL в столбцах PRIMARY KEY. Мы можем изменить SQLite для соответствия стандарту (и возможно это будет сделано в будущем), но за прошедшее время, SQLite получил настолько широкое распространения, что мы боимся сделать ошибочным код, который сейчас корректен, если мы исправим проблему. Поэтому сейчас мы решили разрешить NULL в столбцах PRIMARY KEY. Разработчики должны помнить, что мы можем изменить SQLite в соответствии со стандартом SQL в будущем и должны разрабатывать новые программы в соответствии с ним.

Если ключевые слова "TEMP" или "TEMPORARY" используются между "CREATE" и "TABLE", тогда таблица создается только в рамках соединения с базой и автоматически удаляется при его закрытии. Все индексы, созданные для временной таблицы, также временны. Временные таблицы и индексы хранятся с отдельном файле, отличном от основного файла базы данных.

Если <database-name> определено, тогда таблица создается в указанной базе. Ошибочно указывать одновременно оба <database-name> и ключевое слово TEMP, если <database-name> не "temp". Если имя базы не указано и ключевое слово TEMP не использовано, таблица создается в текущей базе данных.

Возможно указание оператора разрешения конфликтов для каждого условия, если требуется задать альтернативный алгоритм. По умолчанию используется алгоритм ABORT. Различные условия в одной таблице могут иметь различные алгоритмы по умолчанию для разрешения проблем. Если в командах COPY, INSERT или UPDATE определены отличные алгоритмы разрешения конфликтов, тогда они вытесняют алгоритмы, заданные в запросе CREATE TABLE. Для детальной информации смотрите ON CONFLICT.

Ограничение CHECK поддерживается с версии 3.3.0. До версии 3.3.0, CHECK мог указываться, но не соблюдался.

Нет явных ограничений по числу полей или количестве ограничений в таблице. Общий размер данных в одной записи ограничен примерно 1 мб в версии 2.8. В версии 3.0 нет жесткого лимита на объем данных в записи.

Форма определения таблицы CREATE TABLE AS создает таблицу из результата запроса. Имена полей таблицы берутся именами полей в результате запросе.

Точный текст каждого запроса CREATE TABLE хранится в таблице sqlite_master. Каждый раз при открытии базы, все запросы CREATE TABLE считываются из таблицы sqlite_master и используются для генерации внутреннего представления SQLite. Если оригинальной командой была CREATE TABLE AS, тогда создается ее эквивалент CREATE TABLE, который сохраняется в sqlite_master вместо оригинального запроса. Текст CREATE TEMPORARY TABLE хранится в таблице sqlite_temp_master.

Если указан опциональный оператор IF NOT EXISTS и уже есть другая таблица с таким именем, то команда не выполняется.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования