Browse Source

not null data columns

qrort 1 year ago
parent
commit
afaac6f6d6

+ 0 - 2
ydb/docs/ru/core/concepts/datamodel/_includes/table.md

@@ -11,8 +11,6 @@ CREATE TABLE article (
     PRIMARY KEY (id)
 )
 ```
-Обратите внимание, что на текущий момент ограничение `NOT NULL` можно указать только для колонок, входящих в первичный ключ.
-
 YDB поддерживает создание строковых и колоночных таблиц. Основное их отличие — в области применения и формате хранения данных на жестком диске. Для строковых таблиц данные хранятся последовательно в виде строк, а для колоночных — в виде столбцов. У каждого типа таблиц свое предназначение.
 
 ## Строковые таблицы

+ 1 - 1
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` (Эпизоды), выполнив следующий скрипт:
 

+ 33 - 1
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), позволяющая распаковать содержимое опционального типа.

+ 1 - 1
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) -->
+<!-- - [Представление данных в формате YSON](yson.md) -->

+ 1 - 1
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
+  href: yson.md