INSERT — оператор языка SQL, который позволяет добавить строки в таблицу, заполняя их значениями. Значения можно вставлять перечислением с помощью слова values и перечислив их в круглых скобках через запятую или оператором select.
Примеры использования
правитьИспользуя перечисление значений, с указанием столбцов:
insert into <название таблицы> ([<Имя столбца>, ... ]) values (<Значение>,...)
Например:
INSERT INTO phone_book (name, number) VALUES ('John Doe', '555-1212');
Используя перечисление значений, без указания столбцов:
insert into <название таблицы> values (<Значение>,...)
Например:
INSERT INTO phone_book VALUES ('John Doe', '555-1212');
Используя select:
insert into <название таблицы> select <имя столбца>,... from <название таблицы>
В последнем случае, в таблицу может вставиться более одной записи. Если в таблице есть другие поля требующие заполнения, но не указанные в операторе insert, для них будет установлено значение по умолчанию, либо null, если значение по умолчанию не указано.
Альтернативный синтаксис оператора INSERT
правитьВ некоторых СУБД, например, MySQL, существует альтернативный синтаксис оператора INSERT, в котором значения присваиваются столбцам при помощи ключевого слова SET:
insert into <название таблицы> set <имя столбца1> = <значение1>, <имя столбца2> = <значение2>...
Особенности
правитьВо время выполнения оператора могут возникнуть ошибки:
- если при создании таблицы для поля был указан параметр not null и не было определено значение по умолчанию (см. create), то при отсутствии для него вставляемого значения возникнет ошибка. Решение очевидно:
- либо убрать параметр not null
- либо указать значение по умолчанию
- либо вставить значение
- если произойдет попытка вставки в поле с типом identity (автоинкремент), то также произойдет ошибка. Решить проблему можно двумя способами:
- не вставлять значение в это поле
- указать опцию identity_insert on после чего вставить уникальное значение для этого столбца
Опция identity_insert (MS SQL Server)
правитьэта инструкция не будет работать, нужно указывать имя таблицы.
Включить опцию:
SET IDENTITY_INSERT table { ON | OFF }
После включения этой опции можно вставлять значения в поля, определенные как identity. Нужно учесть, что значение должно быть уникальным.
Включать эту опцию без явной необходимости не рекомендуется. Однако, её следует использовать в записях, в которых нужно сменить некоторые столбцы, не поменяв её identity столбец (например, если по этому столбцу делается связь с другой таблицей)
Получение ключа
правитьРазработчики, которые используют суррогатный ключ в качестве первичного ключа, часто сталкиваются со сценарием, когда необходимо получить первичный ключ (для использования в других запросах), сгенерированный базой данных в ответ на оператор SQL INSERT. Но большинство систем не позволяют оператору SQL INSERT возвращать данные. Возможные способы решения:
- Использовать характерную для данной БД хранимую процедуру, которая генерирует суррогатный ключ, исполняет операцию INSERT, и возвращает сгенерированный ключ. Например, в Microsoft SQL Server, ключ возвращается специальной функцией SCOPE_IDENTITY(), а в SQLite функцией last_insert_rowid().
- Использовать характерную для данной БД операцию SELECT над временной таблицей, содержащей последнюю добавленную строку (или строки). DB2 реализует эту возможность следующим образом:
SELECT *
FROM FINAL TABLE ( INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' ) ) AS t
- DB2 для z/OS реализует эту возможность следующим образом:
SELECT EMPNO, HIRETYPE, HIREDATE
FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL) VALUES(’Mary Smith’, 35000.00, 11, ’Associate’));
- Используя оператор SELECT после оператора INSERT, со специальной функцией, которая в данной БД возвращает сгенерированный первичный ключ для последней добавленной строки.
- Используя уникальную комбинацию полей, которые входили в исходный оператор SQL INSERT, в последующих вызовах оператора SELECT.
- Используя GUID в операторе SQL INSERT, получить результат через оператор SELECT.
- Используя функцию PHP mysql_insert_id() для MySQL после оператора INSERT.
- используя INSERT с последующим SELECT LAST_INSERT_ID() для MySQL.
- Используя оператор INSERT с предложением OUTPUT (Transact-SQL) начиная с Microsoft SQL Server 2005.
DECLARE @table TABLE (
[id] [smallint] IDENTITY(1,1) NOT NULL,
[name] [nchar](50) NULL);
INSERT INTO @table
OUTPUT INSERTED.id
VALUES ('Peter Doe');
- Используя оператор INSERT с модификатором RETURNING для PostgreSQL (с версии 8.2) и Firebird (с версии 2.0). Возвращаемый список идентичен результату оператора SELECT.
INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' )
RETURNING phone_book_id
- Используя оператор INSERT с модификатором RETURNING для Oracle. Такой же синтаксис используется в Firebird для процедур, триггеров и блоков исполнения.
INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' )
RETURNING phone_book_id INTO v_pb_id
- Функция IDENTITY() в H2 возвращает последний добавленный (ключ?)
SELECT IDENTITY();
См. также
правитьДля улучшения этой статьи желательно:
|