INSERT

Создание новой строки в таблице.

Обзор

[ 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

  • Определяет строки, конфликтующие со строкой, для которой применяется альтернативное действие ON CONFLICT. Можно указать уникальное правило индекса или явно задать имя ограничения. Для ON CONFLICT DO NOTHING указание conflict_target является необязательным. Если оно опущено, обрабатываются конфликты со всеми действующими ограничениями (и уникальными индексами). Для ON CONFLICT DO UPDATE указание conflict_target обязательно.

conflict_action

  • conflict_action определяет альтернативное действие ON CONFLICT. Оно может быть DO NOTHING или предложением DO UPDATE, которое задаёт детали действия UPDATE, выполняемого при конфликте. Предложения SET и WHERE в ON CONFLICT DO UPDATE могут обращаться к существующим строкам через имя (или псевдоним) таблицы и к вставляемым строкам — через специальную таблицу excluded. Для этого действия требуется привилегия SELECT на любой столбец целевой таблицы, в котором находится указанный столбец.

Обратите внимание, что эффекты всех триггеров уровня строк 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 фиксирует возможные ограничения для предложения запроса.