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