New data types: Nullable and Nothing.

Processing of Nullable in inserts from selects.
Some links and typographic fixes.
This commit is contained in:
BayoNet 2018-07-03 15:51:46 +03:00
parent 0a09fc7707
commit f7ba157b10
8 changed files with 84 additions and 6 deletions

View File

@ -122,10 +122,9 @@ pages:
- 'Табличные функции':
- 'Введение': 'table_functions/index.md'
- 'file': 'table_functions/file.md'
- 'remote': 'table_functions/remote.md'
- 'merge': 'table_functions/merge.md'
- 'numbers': 'table_functions/numbers.md'
- 'remote': 'table_functions/remote.md'
- 'Форматы':
- 'Введение': 'formats/index.md'
@ -166,6 +165,7 @@ pages:
- 'Array(T)': 'data_types/array.md'
- 'AggregateFunction(name, types_of_arguments...)': 'data_types/nested_data_structures/aggregatefunction.md'
- 'Tuple(T1, T2, ...)': 'data_types/tuple.md'
- 'Nullable': 'data_types/nullable.md'
- 'Вложенные структуры данных':
# - 'Вложенные структуры данных': 'data_types/nested_data_structures/index.md'
- 'Nested(Name1 Type1, Name2 Type2, ...)': 'data_types/nested_data_structures/nested.md'
@ -173,6 +173,7 @@ pages:
# - 'Служебные типы данных': 'data_types/special_data_types/index.md'
- 'Expression': 'data_types/special_data_types/expression.md'
- 'Set': 'data_types/special_data_types/set.md'
- 'Nothing': 'data_types/special_data_types/nothing.md'
- 'Операторы': 'operators/index.md'

View File

@ -0,0 +1,46 @@
<a name="data_type-nullable"></a>
# Nullable(TypeName)
Позволяет хранить в таблице [NULL](../query_language/syntax.md#null-literal) вместо значения типа `TypeName`.
В качестве `TypeName` нельзя использовать составные типы данных [Array](array.md#data_type-array) и [Tuple](typle.md#data_type-tuple). Составные типы данных могут содержать значения типа `Nullable`, например `Array(Nullable(Int8))`.
Поле типа `Nullable` нельзя включать в индексы.
## Пример использования
```
:) CREATE TABLE t_null(x Int8, y Nullable(Int8)) engine TinyLog
CREATE TABLE t_null
(
x Int8,
y Nullable(Int8)
)
ENGINE = TinyLog
Ok.
0 rows in set. Elapsed: 0.012 sec.
:) INSERT INTO t_null VALUES (1, NULL)
INSERT INTO t_null VALUES
Ok.
1 rows in set. Elapsed: 0.007 sec.
:) SELECT x+y from t_null
SELECT x + y
FROM t_null
┌─plus(x, y)─┐
│ \N │
└────────────┘
1 rows in set. Elapsed: 0.009 sec.
```

View File

@ -0,0 +1,19 @@
<a name="special_data_type-nothing"></a>
# Nothing
Этот тип данных предназначен только для того, чтобы представлять [NULL](../../query_language/syntax.md#null-literal).
Невозможно создать значение типа `Nothing`, поэтому он используется там, где значение не подразумевается. Например, `NULL` записывается как `Nullable(Nothing)` ([Nullable](../../data_types/nullable.md#data_type-nullable) — это тип данных, позволяющий хранить `NULL` в таблицах). Также тип Nothing используется для обозначения пустых массивов:
```bash
:) SELECT toTypeName(Array())
SELECT toTypeName([])
┌─toTypeName(array())─┐
│ Array(Nothing) │
└─────────────────────┘
1 rows in set. Elapsed: 0.062 sec.
```

View File

@ -1,3 +1,5 @@
<a name="data_type-tuple"></a>
# Tuple(T1, T2, ...)
Кортежи не могут быть записаны в таблицы (кроме таблиц типа Memory). Они используется для временной группировки столбцов. Столбцы могут группироваться при использовании выражения IN в запросе, а также для указания нескольких формальных параметров лямбда-функций. Подробнее смотрите раздел "Операторы IN", "Функции высшего порядка".

View File

@ -84,4 +84,7 @@ JSON совместим с JavaScript. Для этого, дополнитель
`extremes` - экстремальные значения (при настройке extremes, выставленной в 1).
Этот формат подходит только для вывода результата выполнения запроса, но не для парсинга (приёма данных для вставки в таблицу).
ClickHouse поддерживает [NULL](../query_language/syntax.md#null-literal), который при выводе JSON будет отображен как `null`.
Смотрите также формат JSONEachRow.

View File

@ -13,4 +13,4 @@ FixedString представлены просто как последовате
Array представлены как длина в формате varint (unsigned [LEB128](https://en.wikipedia.org/wiki/LEB128)), а затем элементы массива, подряд.
Для поддержки [NULL](../query_language/syntax.md#null-literal) перед каждым значением в строке добавлен дополнительный байт, который содержит 0 или 1. Если 0, то значение не `NULL` и далее идёт значение. Если 1, то значение — `NULL` и этот байт трактуется как отдельное значение.
Для поддержки [NULL](../query_language/syntax.md#null-literal) перед каждым значением типа [Nullable](../data_types/nullable.md#data_type-nullable) в строке добавлен дополнительный байт, который содержит 1 или 0. Если 1, то значение — `NULL` и этот байт трактуется как отдельное значение. Если 0, то после байта идёт не `NULL`-значение.

View File

@ -1,4 +1,4 @@
<a name="values"></a>
<a name="formats-values"></a>
# Values

View File

@ -641,13 +641,20 @@ INSERT INTO t FORMAT TabSeparated
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
```
Соответствие столбцов определяется их позицией в секции SELECT. При этом, их имена в выражении SELECT и в таблице для INSERT, могут отличаться. При необходимости выполняется приведение типов данных, эквивалентное соответствующему оператору CAST.
Соответствие столбцов определяется их позицией в секции `SELECT`. При этом, их имена в выражении `SELECT` и в таблице для `INSERT`, могут отличаться. При необходимости выполняется приведение типов данных, эквивалентное соответствующему оператору `CAST`.
Все форматы данных кроме Values не позволяют использовать в качестве значений выражения, такие как `now()`, `1 + 2` и подобные. Формат Values позволяет ограниченно использовать выражения, но это не рекомендуется, так как в этом случае для их выполнения используется неэффективный вариант кода.
Все форматы данных кроме [Values](..formats/values.md#formats-values) не позволяют использовать в качестве значений выражения, такие как `now()`, `1 + 2` и подобные. Формат `Values` позволяет ограниченно использовать выражения, но это не рекомендуется, так как в этом случае для их выполнения используется неэффективный вариант кода.
Не поддерживаются другие запросы на модификацию части данных: `UPDATE`, `DELETE`, `REPLACE`, `MERGE`, `UPSERT`, `INSERT UPDATE`.
Вы можете удалять старые данные с помощью запроса `ALTER TABLE ... DROP PARTITION`.
Особенности вставки значений типа [Nullable](../data_types/nullable.md#data_types-nullable):
- Если не `Nullable` значение вставляется в `Nullable` поле, то операция происходит без особенностей.
- Если значение типа `Nullable` вставляется в не `Nullable` поле, то ClickHouse проверяет присутствие `NULL` в результатах `SELECT` и если:
- Есть хотя бы один `NULL`, то ClickHouse не выполняет `INSERT` и генерирует исключение.
- Нет ни одного `NULL`, то ClickHouse выполняет `INSERT`, но тип значения преобразуется к типу поля в конечной таблице.
### Замечания о производительности
`INSERT` сортирует входящие данные по первичному ключу и разбивает их на партиции по месяцам. Если вы вставляете данные за разные месяцы вперемешку, то это может значительно снизить производительность запроса `INSERT`. Чтобы избежать этого: