Skip to content

Commit e079e2b

Browse files
dcherednikblinkov
andauthored
Unique constraint docs (en, ru) (#9702)
Co-authored-by: Ivan Blinkov <[email protected]>
1 parent 63a6a81 commit e079e2b

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
lines changed

ydb/docs/en/core/concepts/_includes/secondary_indexes.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ The current version of {{ ydb-short-name }} implements _synchronous_ and _asynch
77
* For synchronous indexes: Transactionally when the main table changes.
88
* For asynchronous indexes: In the background while getting the necessary changes from the main table.
99

10-
When a user sends an SQL query to insert, modify, or delete data, the database transparently generates commands to modify the index table. A table may have multiple secondary indexes. An index may include multiple columns, and the sequence of columns in an index matters. A single column may be included in multiple indexes. In addition to the specified columns, every index implicitly stores the table primary key columns, to enable nvaigation from an index record to the table row.
10+
When a user sends an SQL query to insert, modify, or delete data, the database transparently generates commands to modify the index table. A table may have multiple secondary indexes. An index may include multiple columns, and the sequence of columns in an index matters. A single column may be included in multiple indexes. In addition to the specified columns, every index implicitly stores the table primary key columns to enable navigation from an index record to the table row.
1111

1212
## Synchronous secondary index {#sync}
1313

@@ -21,6 +21,16 @@ Unlike a synchronous index, an asynchronous index doesn't use distributed transa
2121

2222
You can copy the contents of columns into a covering index. This eliminates the need to read data from the main table when performing reads by index and significantly reduces delays. At the same time, such denormalization leads to increased usage of disk space and may slow down inserts and updates due to the need for additional data copying.
2323

24+
## Unique secondary index {#unique}
25+
26+
This type of index enforces unique constraint behavior and, like other indexes, allows efficient point lookup queries. {{ ydb-short-name }} uses it to perform additional checks, ensuring that each distinct value in the indexed column set appears in the table no more than once. If a modifying query violates the constraint, it will be aborted with a `PRECONDITION_FAILED` status. Therefore, client code must be prepared to handle this status.
27+
28+
A unique secondary index is a synchronous index, so the update process is the same as in the [Synchronous secondary index](#sync) section described above from a transaction perspective.
29+
30+
### Limitations
31+
32+
Currently, a unique index cannot be added to an existing table.
33+
2434
## Creating a secondary index online {#index-add}
2535

2636
{{ ydb-short-name }} lets you create new and delete existing secondary indexes without stopping the service. For a single table, you can only create one index at a time.

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/create_table.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ The `INDEX` clause is used to define a {% if concept_secondary_index %}[secondar
102102
```yql
103103
CREATE TABLE table_name (
104104
...
105-
INDEX <index_name> GLOBAL [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> ),
105+
INDEX <index_name> GLOBAL [UNIQUE] [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> ),
106106
...
107107
)
108108
```
@@ -111,6 +111,7 @@ Where:
111111

112112
* **Index_name** is the unique name of the index to be used to access data.
113113
* **SYNC/ASYNC** indicates synchronous/asynchronous data writes to the index. If not specified, synchronous.
114+
* **UNIQUE** indicates that the index should guarantee the uniqueness of the indexed column set, thereby enforcing the unique constraint.
114115
* **Index_columns** is a list of comma-separated names of columns in the created table to be used for a search in the index.
115116
* **Cover_columns** is a list of comma-separated names of columns in the created table, which will be stored in the index in addition to the search columns, making it possible to fetch additional data without accessing the table for it.
116117

@@ -124,6 +125,7 @@ CREATE TABLE my_table (
124125
d Date,
125126
INDEX idx_d GLOBAL ON (d),
126127
INDEX idx_ba GLOBAL ASYNC ON (b, a) COVER (c),
128+
INDEX idx_bc GLOBAL UNIQUE SYNC ON (b, c),
127129
PRIMARY KEY (a)
128130
)
129131
```

ydb/docs/en/core/yql/reference/yql-core/syntax/create_table/secondary_index.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ The INDEX construct is used to define a {% if concept_secondary_index %}[seconda
77
```yql
88
CREATE TABLE table_name (
99
...
10-
INDEX <index_name> GLOBAL [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> ),
10+
INDEX <index_name> GLOBAL [UNIQUE] [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> ),
1111
...
1212
)
1313
```
@@ -16,6 +16,7 @@ Where:
1616

1717
* **Index_name** is the unique name of the index to be used to access data.
1818
* **SYNC/ASYNC** indicates synchronous/asynchronous data writes to the index. If not specified, synchronous.
19+
* **UNIQUE** indicates that the index should guarantee the uniqueness of the indexed column set, thereby enforcing the unique constraint.
1920
* **Index_columns** is a list of comma-separated names of columns in the created table to be used for a search in the index.
2021
* **Cover_columns** is a list of comma-separated names of columns in the created table, which will be stored in the index in addition to the search columns, making it possible to fetch additional data without accessing the table for it.
2122

@@ -29,6 +30,7 @@ CREATE TABLE my_table (
2930
d Date,
3031
INDEX idx_d GLOBAL ON (d),
3132
INDEX idx_ba GLOBAL ASYNC ON (b, a) COVER (c),
33+
INDEX idx_bc GLOBAL UNIQUE SYNC ON (b, c),
3234
PRIMARY KEY (a)
3335
)
34-
```
36+
```

ydb/docs/ru/core/concepts/_includes/secondary_indexes.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@
2121

2222
Имеется возможность сделать копию содержимого колонок в индекс (covering index), таким образом это исключает необходимость чтения из основной таблицы в операциях чтения по индексу, что заметно снижает задержки. В то же время такая денормализация приводит к увеличенному потреблению дискового пространства и к возможному замедлению операции вставки и обновления из-за необходимости дополнительного копирования данных.
2323

24+
## Уникальный вторичный индекс {#unique}
25+
26+
Этот тип индекса реализует семантику уникального значения в колонке или наборе колонок, а также, как и другие индексы, позволяет эффективно выполнять точечные чтения по набору индексируемых колонок. {{ ydb-short-name }} использует его для выполнения дополнительных проверок, чтобы гарантировать, что каждое уникальное значение индексируемых колонок присутствует в таблице не более одного раза. Если модифицирующий запрос нарушает это ограничение, он будет отменён со статусом `PRECONDITION_FAILED`. Таким образом, пользовательский код должен быть готов к обработке этого статуса.
27+
28+
Уникальный вторичный индекс является синхронным индексом, поэтому процесс обновления происходит так же, как описано в разделе [Синхронный вторичный](#sync) с точки зрения транзакции.
29+
30+
### Ограничения
31+
32+
В настоящее время уникальный индекс не может быть добавлен в существующую таблицу.
33+
2434
## Онлайн-создание вторичного индекса {#index-add}
2535

2636
В {{ ydb-short-name }} доступно создание вторичного индекса, а также удаление существующего вторичного индекса без остановки обслуживания. Для одной таблицы можно создать только один индекс за раз.

ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/create_table.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
```yql
103103
CREATE TABLE table_name (
104104
...
105-
INDEX <index_name> GLOBAL [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> ),
105+
INDEX <index_name> GLOBAL [UNIQUE] [SYNC|ASYNC] ON ( <index_columns> ) COVER ( <cover_columns> )
106106
...
107107
)
108108
```
@@ -111,6 +111,7 @@ CREATE TABLE table_name (
111111

112112
* **index_name** — уникальное имя индекса, по которому будет возможно обращение к данным.
113113
* **SYNC/ASYNC** — синхронная или асинхронная запись в индекс, если не указано — синхронная.
114+
* **UNIQUE** — создаёт индекс с гарантией уникальности для вставляемых значений.
114115
* **index_columns** — имена колонок создаваемой таблицы через запятую, по которым возможен поиск в индексе.
115116
* **cover_columns** — имена колонок создаваемой таблицы через запятую, которые будет сохранены в индексе дополнительно к колонкам поиска, давая возможность получить дополнительные данные без обращения за ними в таблицу.
116117

@@ -124,6 +125,7 @@ CREATE TABLE my_table (
124125
d Date,
125126
INDEX idx_d GLOBAL ON (d),
126127
INDEX idx_ba GLOBAL ASYNC ON (b, a) COVER (c),
128+
INDEX idx_bc GLOBAL UNIQUE SYNC ON (b, c),
127129
PRIMARY KEY (a)
128130
)
129131
```

ydb/docs/ru/core/yql/reference/yql-core/syntax/create_table/secondary_index.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ CREATE TABLE table_name (
2020

2121
* **index_name** — уникальное имя индекса, по которому будет возможно обращение к данным.
2222
* **SYNC/ASYNC** — синхронная или асинхронная запись в индекс, если не указано — синхронная.
23+
* **UNIQUE** — создаёт индекс с гарантией уникальности для вставляемых значений.
2324
* **index_columns** — имена колонок создаваемой таблицы через запятую, по которым возможен поиск в индексе.
2425
* **cover_columns** — имена колонок создаваемой таблицы через запятую, которые будет сохранены в индексе дополнительно к колонкам поиска, давая возможность получить дополнительные данные без обращения за ними в таблицу.
2526

@@ -39,6 +40,7 @@ CREATE TABLE table_name (
3940
d Date,
4041
INDEX idx_d GLOBAL ON (d),
4142
INDEX idx_ba GLOBAL ASYNC ON (b, a) COVER (c),
43+
INDEX idx_bc GLOBAL UNIQUE SYNC ON (b, c),
4244
PRIMARY KEY (a)
4345
)
4446
```
@@ -78,4 +80,4 @@ CREATE TABLE my_table (
7880
)
7981
```
8082

81-
{% endif %}
83+
{% endif %}

0 commit comments

Comments
 (0)