Creating row tables in a database
Warning
Currently, the service only supports creating row-based tables. The Terraform provider functionality for creating column-based tables is under development.
In the Terraform context, a table is a resource. That is why, we describe database tables in independent blocks (resource "yandex_ydb_table"
), specifying an internal link to the previously created database.
yandex_ydb_table
resource
Description of the Example of creating a test row-based table with three columns in an existing database:
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table_3_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
column {
name = "a"
type = "Utf8"
not_null = true
}
column {
name = "b"
type = "Uint32"
not_null = true
}
column {
name = "c"
type = "Int32"
not_null = false
}
column {
name = "d"
type = "Timestamp"
}
primary_key = ["a","b"]
}
Properties of the yandex_ydb_table
resource fields:
path
: Path within the database to where the table will be created. The table name is specified without the trailing slash (/
). If there is no directory to host the table, it will be created automatically.connection_string
: Path for connecting to the database. It is used together with theydb_full_endpoint
parameter, which contains the full path to the database:grpcs://ydb.serverless.yandexcloud.net:2135/?database=/ru-central1/b1gv7kfcttio********/etn66ecf1qbt********
. For brevity and simplicity, you can use a link to the"yandex_ydb_database_serverless"
resource with the ID and theydb_full_endpoint
parameter specified, e.g.,yandex_ydb_database_serverless.database1.ydb_full_endpoint
.primary_key
: Primary key of the table. The key can be composite.
Full list of the yandex_ydb_table
resource fields:
Field name | Type | Value | Description |
---|---|---|---|
path | string |
required |
Table path |
connection_string | string |
required |
Connection string |
column | array[column] |
required |
Column data type |
family | array[family] |
optional |
Column group |
primary_key | array[string] |
required |
Primary key of the table |
ttl | ttl |
optional |
TTL Settings |
attributes | map[string]string |
optional |
Table attributes |
partitioning_settings | partitioning_settings |
optional |
Partitioning settings |
key_bloom_filter | boolean |
optional |
Using the Bloom filter for primary key |
read_replicas_settings | string |
optional |
Settings of replications for reading |
The yandex_ydb_table
block contains nested column
blocks that describe individual properties of columns, such as:
Field name | Type | Description |
---|---|---|
name | string required |
Column name |
type | string required |
Column data type. Uses YQL data types |
family | string optional |
Column group |
not_null | boolean optional The default value is false |
The column cannot be NULL |
Example of a full column description:
column {
name = "column_name"
type = "Utf8"
family = "some_family"
not_null = true
}
Warning
Currently, you cannot delete a column using Terraform, you can only add one. To delete a column, first delete it at the database level (for example, using a YQL query), then remove the column from the configuration file.
You can group columns into families
DATA
: Type of storage device for column data in this group. The acceptable values aressd
androt
(named after HDD spindle rotation).COMPRESSION
: Data compression codec. The acceptable values areoff
andlz4
.
To group columns into a family, add the family
block at the same level with the column
block:
family {
name = "my_family"
data = "ssd"
compression = "lz4"
}
Descriptions of family
block fields:
Field name | Type | Description |
---|---|---|
name | string required |
Column group name |
data | string required |
Storage device type for the data in this column group |
compression | string required |
Data compression codec |
Here is an example of grouping two columns into a family:
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table_3_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
column {
name = "a"
type = "Uint16"
family = "test_family_group"
not_null = true
}
column {
name = "b"
type = "Uint32"
family = "test_family_group"
not_null = true
}
family {
name = "test_family_group"
data = "ssd"
compression = "lz4"
}
}
YDB allows you to create a TTL columnDate
, Datetime
, Timestamp
, Uint32
, Uint64
, DyNumber
.
The TTL column is configured by the following block:
ttl {
column_name = "d"
expire_interval = "PT1H" # 1 hour
unit = "seconds" # For numeric column types (non ISO 8601)
}
Description of ttl
field values:
Field name | Type | Description |
---|---|---|
column_name | string required |
TTL column name |
expire_interval | string required |
Time in ISO 8601 |
unit | string optional |
Specified if the TTL column is of numericseconds , milliseconds , microseconds , nanoseconds . |
Partitioning row-based tables
Partitioningpartitioning_settings
parameter of the yandex_ydb_table
resource.
partitioning_settings
block fields
Description of the Example:
resource "yandex_ydb_table" "test_table" {
path = "/test_dir/test_table_3_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
partitioning_settings {
auto_partitioning_min_partitions_count = 5
auto_partitioning_max_partitions_count = 8
auto_partitioning_partition_size_mb = 256
auto_partitioning_by_load = true
...
}
...
}
Full description of partitioning_settings
fields:
Field name | Type | Description |
---|---|---|
uniform_partitions | number optional |
Number of pre-allocated partitions |
partition_at_keys | string optional |
Partitioning by primary key |
auto_partitioning_min_partitions_count | number optional |
Minimum possible number of partitions |
auto_partitioning_max_partitions_count | number optional |
Maximum possible number of partitions |
auto_partitioning_partition_size_mb | number optional |
Specifying auto partitioning by size |
auto_partitioning_by_size_enabled | bool optional |
Auto partitioning by size (bool ); enabled by default (true ). |
auto_partitioning_by_load | bool optional |
Auto partitioning by load (bool ); disabled by default (false ). |