CREATE TABLE reference
To create a new table in the database, the CREATE TABLE
keywords followed by
column definitions are used.
#
SyntaxTo create a table by manually entering parameters and settings:
note
Checking table metadata can be done via the tables()
and table_columns()
functions which are described in the
meta functions documentation page.
To create a table by cloning the metadata of an existing table:
#
IF NOT EXISTSAn optional IF NOT EXISTS
clause may be added directly after the
CREATE TABLE
keywords to indicate that a new table should be created if one
with the desired table name does not already exist.
#
Table nameInternally the table name is used as a directory name on the file system. It can
contain both ASCII and Unicode characters. The table name must be unique and
an error is returned if a table already exists with the requested name. Table
names containing spaces or period .
character must be enclosed in double
quotes, for example:
#
Column nameAs with table names, the column name is used for file names internally. Although it does support both ASCII and Unicode characters, character restrictions specific to the file system still apply. Tables may have up to 2,147,483,647 columns.
note
Column names must be unique within each table and must not contain a period
.
character.
#
Type definitionWhen specifying a column, a name and
type definition must be provided. The symbol
type may have additional optional parameters applied.
#
SymbolsOptional keywords and parameters may follow the symbol
type which allow for
further optimization on the handling of this type. For more information on the
benefits of using this type, see the symbol overview.
#
Symbol capacityCAPACITY
is an optional keyword used when defining a symbol type on table
creation to indicate how many distinct values this column is expected to have.
When distinctValueEstimate
is not explicitly specified, a default value of
cairo.default.symbol.capacity
is used.
distinctValueEstimate
- the value used to size data structures for
symbols.
The symbol capacity is not to be confused with index capacity described in column indexes below.
#
Symbol cachingCACHE | NOCACHE
is used to specify whether a symbol should be cached. The
default value is CACHE
unless otherwise specified.
#
Casting typescastDef
- casts the type of a specific column. columnRef
must reference
existing column in the selectSql
#
Column indexesIndex definitions (indexDef
) are used to create an
index for a table column. The referenced table column
must be of type symbol.
An index capacity may be provided for the index by defining the index storage
parameter, valueBlockSize
:
See Index for more information about index capacity.
#
CREATE TABLE ASWhen SQL (selectSQL
) is SELECT * FROM tab
or any arbitrary SQL result, the
selected column names and their data type will be cloned to the new table.
The data type of a column can be changed:
Here we changed type of price
(assuming it was INT
) to LONG
and changed
type of sym
to symbol and created an
index.
#
Designated timestampThe timestamp function allows for specifying which column (which must be of
timestamp
type) should be a designated timestamp for the table. For more
information, see the designated timestamp
reference.
The designated timestamp column cannot be changed after the table has been created.
#
PartitioningPARTITION BY
allows for specifying the
partitioning strategy for the table. Tables created
via SQL are not partitioned by default (NONE
) and tables can be partitioned by one of
the following:
NONE
: the default when partition is not defined.YEAR
MONTH
WEEK
DAY
HOUR
The partitioning strategy cannot be changed after the table has been created.
#
WAL table parameterIt is possible to create a WAL table, allowing concurrent data ingestion and modification through multiple interfaces:
WAL
creates a WAL table. When a WAL table is created, the table must has a partition that is notNONE
.BYPASS WAL
creates a non-WAL table.- When neither option is specified,
the server configuration,
cairo.wal.enabled.default
, is used:true
: creates a WAL table.false
: creates a non-WAL table.
#
WITH table parameterThe parameter influences how often commits of out-of-order data occur. It may be
set during table creation using the WITH
keyword.
maxUncommittedRows
- defines the maximum number of uncommitted rows per-table
to keep in memory before triggering a commit for a specific table.
The purpose of specifying maximum uncommitted rows per table is to reduce the occurrences of resource-intensive commits when ingesting out-of-order data.
The global setting for the same parameter is cairo.max.uncommitted.rows
.
Checking the values per-table may be done using the tables()
function:
id | name | maxUncommittedRows |
---|---|---|
1 | my_table | 250000 |
2 | device_data | 10000 |
#
Table target volumeThe IN VOLUME
clause is used to create a table in a different volume than the standard. The table
is created in the specified target volume, and a symbolic link is created in the table's standard
volume to point to it.
The use of the comma (,
) depends on the existence of the WITH
clause:
If the
WITH
clause is present, a comma is mandatory beforeIN VOLUME
:If no
WITH
clause is used, the comma must not be added for theIN VOLUME
segment:
The use of quotation marks ('
) depends on the alias:
If the alias contains spaces, the quotation marks are required:
If the alias does not contain spaces, no quotation mark is necessary:
#
DescriptionThe table behaves the same way as if it had been created in the standard (default)
volume, with the exception that DROP TABLE
removes the symbolic link from the standard volume but the content pointed to is
left intact in its volume. A table using the same name in the same
volume cannot be created again as a result, it requires manual intervention
to either remove or rename the table's directory in its volume.
#
ConfigurationThe secondary table target volume is defined by
cairo.volumes
in
server.conf
. The default setting
contains an empty list, which means the feature is not enabled.
To enable the feature, define as many volume pairs as you need, with syntax alias -> volume-root-path, and separate different pairs with a comma. For example:
Additional notes about defining the alias and volume root paths:
- Aliases are case-insensitive.
- Volume root paths must be valid and exist at bootstrap time and at the time when the table is created.
- Aliases and/or volume root paths can be single quoted, it is not required.
#
QuestDB 6.5.5 and earlier versionsFrom QuestDB 6.6 onwards, the database adjusts relevant settings automatically and provides optimal ingestion speed.
commitLag
- equivalent tocairo.commit.lag
expects a value with a modifier to specify the unit of time for the value:unit description us microseconds s seconds m minutes h hours d days
For more information on commit lag and the maximum uncommitted rows, see the guide for out-of-order commits and ILP commit strategy.
#
CREATE TABLE LIKEThe LIKE
keyword clones the table schema of an existing table without copying
the data. Table settings and parameters such as designated timestamp, symbol
column indexes, and index capacity will be cloned, too.
#
ExamplesThe following examples demonstrate creating tables from basic statements, and introduce features such as partitioning and designated timestamps. For more information on the concepts introduced to below, see
- designated timestamp reference on electing a timestamp column
- partition documentation which describes how partitions work in QuestDB
- symbol reference for using the
symbol
data type
This example will create a table without a designated timestamp and does not have a partitioning strategy applied.
The same table can be created and a designated timestamp may be specified.
Let's assume we imported a text file into the table taxi_trips_unordered
and
now we want to turn this data into time series through ordering trips by
pickup_time
, assign dedicated timestamp and partition by month: