Transact-SQL - вставка данных

69 Исходники баз данных

Кроме инструкции SELECT, которая была рассмотрена ранее, язык манипуляции данными DML (Data Manipulation Language) содержит три другие инструкции: INSERT, UPDATE и DELETE. Подобно инструкции SELECT эти три инструкции оперируют либо таблицами, либо представлениями. В этой статье рассматривается инструкция INSERT, а две другие инструкции рассматриваются в следующей статье.

Инструкция INSERT вставляет строки (или части строк) в таблицу. Существует две разные формы этой инструкции:

INSERT [INTO] tab_name [(col_list)]
    DEFAULT VALUES | VALUES ({ DEFAULT | NULL | expression } [ ,...n] )
    
INSERT INTO tab_name | view_name [(col_list)]
    {select_statement | execute_statement}


Соглашения по синтаксису

Первая форма инструкции позволяет вставить в таблицу одну строку (или часть ее). А вторая форма инструкции INSERT позволяет вставить в таблицу результирующий набор инструкции SELECT или хранимой процедуры, выполняемой посредством инструкции EXECUTE. Хранимая процедура должна возвращать данные для вставки в таблицу. Применяемая с инструкцией INSERT инструкция SELECT может выбирать значения из другой или той же самой таблицы, в которую вставляются данные, при условии совместимости типов данных соответствующих столбцов.

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

Вставка одной строки

Для обеих форм инструкции INSERT явное указание списка столбцов не является обязательным. Отсутствие списка столбцов равнозначно указанию всех столбцов таблицы.

Параметр DEFAULT VALUES вставляет значения по умолчанию для всех столбцов. В столбцы с типом данных TIMESTAMP или свойством IDENTITY по умолчанию вставляются значения, автоматически создаваемые системой. Для столбцов других типов данных вставляется соответствующее ненулевое значение по умолчанию, если таково имеется, или NULL в противном случае. Если для столбца значения NULL не разрешены и для него не определено значение по умолчанию, выполнение инструкции INSERT завершается ошибкой и выводится соответствующее сообщение.

В примере ниже показана вставка строк в таблицу Employee базы данных SampleDb, демонстрируя использование инструкции INSERT для вставки небольшого объема данных в базу данных:

USE SampleDb;

INSERT INTO Employee VALUES (34990, 'Андрей', 'Батонов', 'd1');
INSERT INTO Employee VALUES (38640, 'Алексей', 'Васин', 'd3');

Существует два разных способа вставки значений в новую строку. Инструкция INSERT в примере ниже явно использует ключевое слово NULL и вставляет значение NULL в соответствующий столбец:

USE SampleDb;

INSERT INTO Employee VALUES (34991, 'Андрей', 'Батонов', NULL);

Чтобы вставить значения в некоторые (но не во все) столбцы таблицы, обычно необходимо явно указать эти столбцы. Не указанные столбцы должны или разрешать значения NULL, или для них должно быть определено значение по умолчанию.

USE SampleDb;

INSERT INTO Employee(Id, FirstName, LastName)
    VALUES (34992, 'Андрей', 'Батонов');

Предыдущие два примера равнозначны. В таблице Employee единственным столбцом, разрешающим значения NULL, является столбец DepartmentNumber, а для всех прочих столбцов это значение было запрещено предложением NOT NULL в инструкции CREATE TABLE.

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

USE SampleDb;

INSERT INTO Employee(DepartamentNumber, LastName, Id, FirstName)
    VALUES ('d1', 'Батонов', 34993, 'Андрей');

Вставка нескольких строк

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

USE SampleDb;

CREATE TABLE MoscowDepartment (
    Number CHAR(4) NOT NULL,
    DepartmentName NCHAR(40) NOT NULL);

INSERT INTO MoscowDepartment (Number, DepartmentName)
    SELECT Number, DepartmentName
        FROM Department
        WHERE Location = 'Москва';

Создаваемая в примере выше новая таблица MoscowDepartment имеет те же столбцы, что и существующая таблица Department, за исключением отсутствующего столбца Location. Подзапрос в инструкции INSERT выбирает в таблице Department все строки, для которых значение столбца Location равно 'Москва', которые затем вставляются в созданную в начале запроса новую таблицу.

В примере ниже показан еще один способ вставки строк в таблицу, используя вторую форму инструкции INSERT. В данном случае выполняется запрос на выборку табельных номеров, номеров проектов и дат начала работы над проектом для всех сотрудников с должностью 'Менеджер', которые работают над проектом p2 с последующей загрузкой полученного результирующего набора в новую таблицу, создаваемую в начале запроса:

USE SampleDb;

CREATE TABLE ManagerTeam (
    EmpId INT NOT NULL,
    ProjectNumber CHAR (4) NOT NULL,
    EnterDate DATE);

INSERT INTO ManagerTeam (EmpId, ProjectNumber, EnterDate)
    SELECT EmpId, ProjectNumber, EnterDate
    FROM Works_on
    WHERE Job = 'Менеджер';

Перед вставкой строк с помощью инструкции INSERT таблицы MoscowDepartment и ManagerTeam (в примерах выше) были пустыми. Если же таблица уже существовала и содержала строки с данными, то к ней были бы добавлены новые строки.

Конструкторы значений таблицы и инструкция INSERT

Конструктор значений таблицы или строки (table (row) value constructor) позволяет вставить в таблицу несколько записей (строк) посредством инструкции языка DML, такой как, например, INSERT или UPDATE. В примере ниже показана вставка в таблицу нескольких строк, используя такой конструктор с помощью инструкции INSERT:

USE SampleDb;

INSERT INTO Employee 
    VALUES (34995, 'Андрей', 'Батонов', 'd1'),
           (38641, 'Алексей', 'Васин', 'd3'),
           (12590, 'Светлана', 'Рыжова', 'd3');

В этом примере ниже инструкция INSERT одновременно вставляет три строки в таблицу Department, используя конструктор значений таблицы. Как можно видеть, синтаксис этого конструктора довольно простой. Для вставки в таблицу строк с данными посредством конструктора значений таблицы нужно в круглых скобках перечислить значения каждой строки, разделяя как значения каждого списка, так и отдельные списки запятыми.

Пройди тесты
Лучший чат для C# программистов