Создание новой строки в таблице.
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table [( column [, ...] )]
{DEFAULT VALUES | VALUES ( {expression | DEFAULT} [, ...] ) [, ...] | query}
[ON CONFLICT [conflict_target] conflict_action]
[RETURNING * | output_expression [[AS] output_name] [, ...]]
Where conflict_target can be one of the following:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
And conflict_action is one of the following:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
INSERT добавляет новые строки в таблицу. Можно вставить одну или несколько строк, заданных выражением значений, либо ноль или более строк, сгенерированных запросом.
Имена целевых столбцов могут быть указаны в любом порядке. Если список имён столбцов не указан вообще, столбцы в таблице упорядочиваются в соответствии с порядком их объявления. Значения, предоставляемые предложением VALUES или запросом, сопоставляются со списком столбцов (явным или неявным) слева направо.
Каждый столбец, отсутствующий в явном или неявном списке столбцов, будет заполнен значением по умолчанию — либо его объявленным значением по умолчанию, либо NULL, если значение по умолчанию не задано.
Если типы данных выражений для какого-либо столбца указаны неверно, будет предпринята попытка автоматического преобразования типов.
YMatrix поддерживает синтаксис INSERT INTO ... VALUES ... ON CONFLICT ... DO ... для выполнения операций UPSERT над данными HEAP-таблиц. Ограничения: при использовании функции UPSERT уникальное ограничение или индекс при создании таблицы должен содержать ключ распределения. В то же время UPSERT не поддерживает перемещение данных между разными экземплярами и не поддерживает обновление ключей распределения. Дополнительную информацию об использовании UPSERT см. в разделе Сценарий пакетного слияния данных (UPSERT). Данная команда применима только к HEAP-таблицам.
Необязательное предложение RETURNING заставляет INSERT вычислить и вернуть значение на основе каждой фактически вставленной строки. Это полезно для получения значений по умолчанию (например, серийных номеров). Однако допускаются любые выражения с использованием столбцов таблицы. Синтаксис списка RETURNING совпадает с синтаксисом выходного списка в SELECT.
Для вставки в таблицу необходимо иметь привилегию INSERT. При указании списка столбцов достаточно иметь привилегию INSERT только на перечисленные столбцы. Использование предложения RETURNING требует наличия привилегии SELECT на все столбцы, упомянутые в RETURNING. Если для вставки строк используется запрос, необходимо иметь привилегию SELECT на все таблицы и столбцы, на которые ссылается запрос.
Примечание!
UPSERT не является стандартным SQL-оператором, а представляет собой операцию обновления/вставки, поддерживаемую в определённых сценариях для упрощения массовой загрузки данных.
После успешного завершения команда INSERT возвращает следующую метку:
INSERT oid count
Здесь count — количество вставленных строк. Если count равен 1, а целевая таблица имеет OID, то OID — это OID, присвоенный вставленной строке. В противном случае OID равен нулю.
insert
with_query
WITH позволяет указать один или несколько подзапросов, на которые можно ссылаться по имени в основном запросе INSERT. INSERT, содержащих предложение WITH, данное предложение может включать только операторы SELECT, а предложение WITH не может содержать команды модификации данных (INSERT, UPDATE или DELETE). SELECT) также может содержать предложение WITH. В этом случае в запросе INSERT можно ссылаться на два набора with_query, но второй набор имеет приоритет из-за более глубокого уровня вложенности.table
column
DEFAULT VALUES
Expression
DEFAULT
query
SELECT), предоставляющий строки для вставки. Описание синтаксиса см. в описании оператора SELECT.output_expression
INSERT после вставки каждой строки. Это выражение может использовать любые имена столбцов таблицы. Указание * возвращает все столбцы вставленной строки.output_name
Предложение ON CONFLICT
ON CONFLICT DO UPDATE гарантирует атомарный результат INSERT или UPDATE. Без возникновения конфликтующих ошибок один из этих двух результатов гарантированно достигается даже при очень высокой степени параллелизма. Эту операцию также называют UPSERT — «UPDATE или INSERT».
conflict_target
conflict_action
Обратите внимание, что эффекты всех триггеров уровня строк BEFORE INSERT отражаются в значениях таблицы excluded, поскольку эти триггеры могут помешать вставке строки.
Чтобы вставить данные в секционированную таблицу, укажите корневую секционированную таблицу — таблицу, созданную с помощью команды CREATE TABLE. Также можно указать листовую таблицу секционированной таблицы в команде INSERT. Если данные недопустимы для указанной листовой таблицы, возвращается ошибка. Указание подтаблиц, не являющихся листовыми, в команде INSERT не поддерживается. Выполнение других DML-команд, таких как UPDATE и DELETE, на любых подтаблицах секционированных таблиц не поддерживается. Эти команды должны выполняться только на корневой секционированной таблице (таблице, созданной с помощью команды CREATE TABLE).
Вставка строки в таблицу films:
INSERT INTO films VALUES ('UA502', 'Bananas', 105,
'1971-07-13', 'Comedy', '82 minutes');
В этом примере столбец length опущен, поэтому он получит значение по умолчанию:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
В этом примере вместо указания значения используется конструкция DEFAULT для столбца date_prod:
INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT,
'Comedy', '82 minutes');
Вставка строки, состоящей полностью из значений по умолчанию:
INSERT INTO films DEFAULT VALUES;
Вставка нескольких строк с использованием синтаксиса VALUES:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
Этот пример вставляет некоторые строки из таблицы films в таблицу films, имеющую ту же структуру столбцов, что и films:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <
'2004-05-07';
Вставка строки в таблицу distributors с возвратом сгенерированного последовательного номера из предложения DEFAULT:
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;
Реализация UPSERT в HEAP-таблице:
// Create a test table
CREATE TABLE conditions (
tag_id text NOT NULL,
ts timestamptz not null,
location text ,
temperature double precision ,
humidity double precision
) DISTRIBUTED BY (tag_id);
// Create a unique index
CREATE UNIQUE INDEX ON conditions(tag_id,ts);
// Insert test data
INSERT INTO conditions(tag_id,ts,location) VALUES('tag1','2022-07-19 00:00:00','office') ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,temperature) VALUES('tag1','2022-07-19 00:00:00',70.2) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,humidity) VALUES('tag1','2022-07-19 00:00:00',50.1) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
// View test data
mydb=# SELECT * FROM conditions;
tag_id | ts | location | temperature | humidity
--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tag1 | 2022-07-19 00:00:00+08 | office | |
(1 row)
Time: 16.340 ms
INSERT соответствует стандарту SQL. Стандарт не допускает опускание списков имён столбцов, если не все столбцы заполняются с помощью предложения VALUES или запроса.
SELECT фиксирует возможные ограничения для предложения запроса.