Модификация данных¶
Для выполнения операций модификации данных в Tarantool Column Store используются
запросы SQL DML. Их можно отсылать как через SQL-драйвер, так и
в виде POST-запроса на HTTP-адрес /sql.
Примечание
Текущие ограничения:
При записи данных блокируются все таблицы целиком.
Механизмы решения конфликтных ситуаций при работе с данными (как, например, DO NOTHING ON CONFLICT в PostgreSQL) не поддерживаются.
Вставка данных¶
TCS поддерживает несколько вариантов вставки данных в таблицу:
SQL-запрос с помощью SQL-драйверов;
SQL-запрос на HTTP-адрес
/sql;HTTP-запрос с данными в формате JSON на HTTP-адрес
/insert.
Вставка данных через SQL-драйверы¶
Для вставки данных в таблицу используются SQL-запросы с оператором INSERT
вида INSERT INTO table_name { VALUES ( expression [, ...] ) [, ...] | query }.
В одном запросе можно передавать как один, так и несколько объектов для вставки. TCS обрабатывает объекты в том порядке, в каком они указаны в запросе.
В значениях полей можно указывать как конкретные значения, так и null.
Пример:
INSERT INTO target_table VALUES (1, 'One'), (2, 'Two');
Также в запросах можно использовать аргументы-заполнители (placeholders).
Вставка данных через /sql¶
Вставка данных чере HTTP-адрес /sql производится с помощью SQL-запросов, полностью аналогичных
тем, что используются при вставке данных через SQL-драйверы.
Алгоритм обработки запросов и их быстродействие здесь также аналогичны.
Вставка данных через /insert¶
HTTP-адрес /insert используется для выполнения запросов на вставку как более быстрая
альтернатива SQL-драйверам и HTTP-адресу /sql.
Вставка через HTTP-адрес /insert работает быстрее, поскольку не требует
ресурсоемкого построения планов.
При этом способе вставки производятся лишь 2 дополнительных действия:
проверка соответствия типов переданных значений и типов колонок;
перевод данных в необходимый формат для вставки в Tarantool.
Через HTTP-адрес /insert данные передаются не с помощью SQL-запросов, а с помощью
HTTP-запросов в сериализованном виде в формате JSON.
Требования к HTTP-запросам:
Запросы отсылаются на HTTP-адрес вида
/insert/$name, где/$name– это имя таблицы.Тело запроса должно содержать массив описаний вставляемых объектов.
Для каждой строки указываются значения вида
"имя_колонки": значение. Их требуется указывать для всех колонок, которые есть в таблице.Порядок колонок в запросе может быть любым. Например,
[{ "a": 1, "b": 2 }]эквивалентно[{ "b": 2, "a": 1 }].Значения
nullможно опускать. Например,[{ "a": 1, "b": null }]эквивалентно[{ "a": 1 }].В заголовке запроса нужно обязательно указывать
content-type: application/json.
Пример: вставка данных в таблицу target_table с помощью утилиты curl.
curl -u 'tcs:tcs' -H 'Content-Type: application/json' -d '[{"a":1, "b":-1}, {"a":2, "b": -2}]' http://localhost:7777/insert/target_table
Вставка данных из выборки (insert into select)¶
Для вставки в таблицу объектов из выборки используйте SQL-запрос вида
INSERT INTO table_1 SELECT attribute FROM table_2.
Пример:
INSERT INTO names SELECT name FROM users
В операциях вставки из выборки можно использовать все имеющиеся в TCS возможности SELECT-запросов, например осуществлять выборку из нескольких таблиц (оператор JOIN) и задавать условия с помощью оператора WHERE. Подробнее см. Справочник по SQL > Инструкция SELECT.
Порядок полей таблиц и типы должны совпадать. Например, возьмем две таблицы:
таблицу
names, которая содержит 2 поля,nameиage(именно в таком порядке они объявлены в модели данных);таблицу
users, которая содержит поляaddress,age,nameи прочие.
Следующий запрос составлен с учетом порядка полей в этих таблицах:
INSERT INTO names SELECT name, age FROM users