SQL-сервер ВСТАВКА

В этом уроке вы узнаете, как использовать оператор INSERT для добавления новой строки в таблицу.

Введение в оператор INSERT SQL Server

Чтобы добавить одну или несколько строк в таблицу, используйте оператор INSERT. Ниже показана самая простая форма оператора INSERT:

INSERT INTO table_name(column_list)
VALUES(value_list);

Давайте рассмотрим этот синтаксис более подробно.

Сначала вы указываете имя таблицы, которую хотите вставить. Обычно вы ссылаетесь на имя таблицы по имени схемы, например, production.products, где production — это имя схемы, а products — это имя таблицы.

Во-вторых, вы указываете список из одного или нескольких столбцов, в которые вы хотите вставить данные. Вы должны заключить список столбцов в скобки и разделить столбцы запятыми.

Если столбец таблицы не отображается в списке столбцов, SQL Server должен иметь возможность предоставить значение для вставки, иначе строка не может быть вставлена.

SQL Server автоматически использует следующее значение для столбца, который доступен в таблице, но не отображается в списке столбцов оператора INSERT:

  • Следующее инкрементное значение, если столбец имеет свойство IDENTITY.
  • Значение по умолчанию, если для столбца указано значение по умолчанию.
  • Текущее значение метки времени, если тип данных столбца является типом данных метки времени.
  • Значение NULL, если столбец допускает значение NULL.
  • Вычисленное значение, если столбец является вычисляемым столбцом.

В-третьих, вы предоставляете список значений для вставки в предложение VALUES. Каждый столбец в списке столбцов должен иметь соответствующее значение в списке значений. Кроме того, вы должны заключить список значений в скобки.

Примеры операторов INSERT для SQL Server

Давайте создадим новую таблицу под названием promotions для демонстрации:

CREATE TABLE sales.promotions(
    promotion_id INT PRIMARY KEY IDENTITY(1, 1),
    promotion_name VARCHAR(255) NOT NULL,
    discount NUMERIC(3, 2) DEFAULT 0,
    start_date DATE NOT NULL,
    expired_date DATE NOT NULL
); 

В этом операторе мы создали новую таблицу с именем promotions в схеме продаж. Таблица promotions имеет пять столбцов, включая идентификационный номер акции, название, скидку, дату начала и дату истечения срока действия.

Идентификационный номер рекламной акции — это столбец идентификаторов, поэтому его значение автоматически заполняется SQL Server при добавлении новой строки в таблицу.

1) Базовый пример INSERT

Следующий оператор вставляет новую строку в таблицу акций:

INSERT INTO sales.promotions(
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
   (
        '2018 Summer Promotion',
        0.15,
        '20180601',
        '20180901'
    );

В этом примере мы указали значения для четырех столбцов в таблице promotions. Мы не указали значение для столбца promotion_id, поскольку SQL Server предоставляет значение для этого столбца автоматически.

Если оператор INSERT выполнен успешно, вы получите количество вставленных строк. В этом случае SQL Server выдал следующее сообщение:

(1 row affected)

Для проверки операции вставки используйте следующий запрос:

SELECT
    *
FROM
    sales.promotions;

Вот результат, как вы и ожидали.

Пример SQL Server INSERT

2) Вставка и возврат вставленных значений

Чтобы захватить вставленные значения, используйте предложение OUTPUT. Например, следующий оператор вставляет новую строку в таблицу promotions и возвращает вставленное значение столбца promotion_id:

INSERT INTO sales.promotions(
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
   (
        '2018 Fall Promotion',
        0.15,
        '20181001',
        '20181101'
    );

Пример SQL Server INSERT OUTPUT

Чтобы захватить вставленные значения из нескольких столбцов, укажите столбцы в выходных данных, как показано в следующем операторе:

INSERT INTO sales.promotions(
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id,
 inserted.promotion_name,
 inserted.discount,
 inserted.start_date,
 inserted.expired_date
VALUES
   (
        '2018 Winter Promotion',
        0.2,
        '20181201',
        '20190101'
    );

Вывод следующий:

SQL Server INSERT OUTPUT несколько столбцов

3) Вставьте явные значения в столбец идентификаторов.

Обычно значение для столбца идентификаторов не указывается, поскольку SQL Server предоставит это значение автоматически.

Однако в некоторых ситуациях вам может потребоваться вставить значение в столбец идентификаторов, например при миграции данных.

См. следующий оператор INSERT:

INSERT INTO sales.promotions(
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
) OUTPUT inserted.promotion_id
VALUES
   (
        4,
        '2019 Spring Promotion',
        0.25,
        '20190201',
        '20190301'
    );

SQL Server выдал следующую ошибку:

Cannot insert explicit value for identity column in table 'promotions' when IDENTITY_INSERT is set to OFF.

Чтобы вставить явное значение для столбца идентификаторов, необходимо сначала выполнить следующий оператор:

SET IDENTITY_INSERT table_name ON;

Чтобы отключить вставку идентификатора, используйте аналогичный оператор:

SET IDENTITY_INSERT table_name OFF;

Давайте выполним следующие операторы, чтобы вставить значение для столбца идентификаторов в таблицу рекламных акций:

SET IDENTITY_INSERT sales.promotions ON;
INSERT INTO sales.promotions(
    promotion_id,
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
   (
        4,
        '2019 Spring Promotion',
        0.25,
        '20190201',
        '20190301'
    );
SET IDENTITY_INSERT sales.promotions OFF;

В этом примере мы сначала включили вставку идентификаторов, затем вставили строку с явным значением для столбца идентификаторов и, наконец, отключили вставку идентификаторов.

Ниже показаны данные таблицы акций после вставки:

SELECT * FROM sales.promotions;

Результат INSERT SQL Server

В этом руководстве вы узнали, как использовать оператор SQL Server INSERT для добавления новой строки в таблицу.

Мирослав С.

Автор статей, ИБ-специалист