diff options
author | qrort <qrort@yandex-team.com> | 2023-12-01 10:18:15 +0300 |
---|---|---|
committer | qrort <qrort@yandex-team.com> | 2023-12-01 10:35:01 +0300 |
commit | afaac6f6d6d85e5cd8b778669a5519d09766153a (patch) | |
tree | 14e793a044a4fce5b583764d61a3c7276642be44 | |
parent | 7ce4c0bcc00d2d3b8c7b2b655d6ded409b07de5c (diff) | |
download | ydb-afaac6f6d6d85e5cd8b778669a5519d09766153a.tar.gz |
not null data columns
5 files changed, 36 insertions, 6 deletions
diff --git a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md index 6726ab2868..f46adb1d96 100644 --- a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md +++ b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md @@ -11,8 +11,6 @@ CREATE TABLE article ( PRIMARY KEY (id) ) ``` -Обратите внимание, что на текущий момент ограничение `NOT NULL` можно указать только для колонок, входящих в первичный ключ. - YDB поддерживает создание строковых и колоночных таблиц. Основное их отличие — в области применения и формате хранения данных на жестком диске. Для строковых таблиц данные хранятся последовательно в виде строк, а для колоночных — в виде столбцов. У каждого типа таблиц свое предназначение. ## Строковые таблицы diff --git a/ydb/docs/ru/core/getting_started/_includes/yql.md b/ydb/docs/ru/core/getting_started/_includes/yql.md index cadd05704c..1e375b5c1d 100644 --- a/ydb/docs/ru/core/getting_started/_includes/yql.md +++ b/ydb/docs/ru/core/getting_started/_includes/yql.md @@ -43,7 +43,7 @@ YQL - язык запросов к базе данных {{ ydb-short-name }}, Таблица с заданными колонками создается [командой YQL `CREATE TABLE`](../../yql/reference/syntax/create_table.md). В таблице обязательно должен быть определен первичный ключ. Типы данных для колонок приведены в статье [Типы данных YQL](../../yql/reference/types/index.md). -По умолчанию все колонки опциональные и могут содержать `NULL`. Для колонок, входящих в первичный ключ, можно указать ограничение `NOT NULL`. Ограничения `FOREIGN KEY` {{ ydb-short-name }} не поддерживает. +По умолчанию все колонки опциональные и могут содержать `NULL`. Для колонок можно указать ограничение `NOT NULL`. Ограничения `FOREIGN KEY` {{ ydb-short-name }} не поддерживает. Создайте таблицы каталога сериалов: `series` (Сериалы), `seasons` (Сезоны), и `episodes` (Эпизоды), выполнив следующий скрипт: diff --git a/ydb/docs/ru/core/yql/reference/yql-core/types/_includes/optional.md b/ydb/docs/ru/core/yql/reference/yql-core/types/_includes/optional.md index 2d9ff8b632..59e2df3439 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/types/_includes/optional.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/types/_includes/optional.md @@ -15,7 +15,9 @@ {% note info %} -Контейнерные типы (включая контейнеры `Optional<T>` и производные от них более сложные типы) в настоящее время нельзя использовать в качестве типов данных колонок при создании таблиц {{ ydb-short-name }}. +По умолчанию, при указании примитивного типа `T` как типа колонки таблицы {{ ydb-short-name }} в базе данных создается соответсвующий контейнерный тип `Optional<T>`. Колонку с типом `T` можно создать, используя ключевое слово `NOT NULL`. +В явном виде контейнерные типы (включая контейнеры `Optional<T>` и производные от них более сложные типы) в настоящее время нельзя использовать в качестве типов данных колонок при создании таблиц {{ ydb-short-name }}. + Запросы YQL могут возвращать значения контейнерных типов, а также принимать их в качестве входных параметров. {% endnote %} @@ -54,3 +56,33 @@ SELECT (2, NULL) == (1, 3), -- Just(False) (выражение эквивалентно 2 == 1 AND NULL == 3) ``` +## Типы данных, не допускающие значение NULL {#notnull} + +[Примитивные типы](../primitive.md) YQL не могут хранить в себе значение `NULL`: для хранения `NULL` предназначен описанный выше контейнер `Optional`. В терминах SQL примитивные типы YQL являются _non-nullable_ типами. + +В YQL отсутствует неявное преобразование типов из `Optional<T>` в `T`, поэтому выполнимость `NOT NULL` ограничения на колонку таблицы обеспечивается на этапе компиляции запроса {{ ydb-short-name }}. + +Создать non-nullable колонку в таблице {{ ydb-short-name }} можно с помощью операции [CREATE TABLE](../../../reference/syntax/create_table.md), пользуясь ключевым словом `NOT NULL`. +**Пример** +```sql +CREATE TABLE t ( + Key Uint64 NOT NULL, + Value String NOT NULL, + PRIMARY KEY (Key)) +``` + +После этого операции записи в таблицу `t` будут выполняться, только если среди значений на вставку в колонки `key`, `value` будут отсутствовать значения NULL. + +### Пример взаимодействия NOT NULL ограничения с функциями YQL + +Многие из функций YQL имеют опциональные типы в качестве возвращаемого значения. Так как YQL является строго типизированным языком, запрос вида +```sql +CREATE TABLE t ( + c Utf8 NOT NULL, + PRIMARY KEY (c) +); + +INSERT INTO t(c) +SELECT CAST('q' AS Utf8); +``` +не может быть исполнен. Причиной этому является несоответствие типов колонки `c`, имеющей тип `Utf8`, и результата функции `CAST`, имеющей тип `Optional<Utf8>`. Для корректной работы запроса в таких сценариях требуется использовать функцию [COALESCE](../../builtins/basic.md#coalesce), аргументом которой можно указать fallback-значение для вставки в таблицу для случая, когда функция (в примере `CAST`) вернет пустой `Optional`. Если же в случае пустого `Optional` нужно не выполнять вставку, а вернуть ошибку, то для этого подойдет функция [UNWRAP](../../builtins/basic.md#optional-ops), позволяющая распаковать содержимое опционального типа. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/types/index.md b/ydb/docs/ru/core/yql/reference/yql-core/types/index.md index 04a21a0499..065765be1b 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/types/index.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/types/index.md @@ -9,4 +9,4 @@ - [Преобразования типов](cast.md) - [Текстовое представление типов данных](type_string.md) - [Представление данных в формате JSON](json.md) -<!-- - [Представление данных в формате YSON](yson.md) -->
\ No newline at end of file +<!-- - [Представление данных в формате YSON](yson.md) --> diff --git a/ydb/docs/ru/core/yql/reference/yql-core/types/toc_i.yaml b/ydb/docs/ru/core/yql/reference/yql-core/types/toc_i.yaml index bfadb9fa38..af3cb084f7 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/types/toc_i.yaml +++ b/ydb/docs/ru/core/yql/reference/yql-core/types/toc_i.yaml @@ -17,4 +17,4 @@ items: href: json.md - name: YSON hidden: true - href: yson.md
\ No newline at end of file + href: yson.md |