Вставить (SQL) - Insert (SQL)

А SQL ВСТАВЛЯТЬ оператор добавляет одну или несколько записей к любому отдельному стол в реляционная база данных.

Основная форма

Операторы вставки имеют следующую форму:

ВСТАВИТЬ В стол (column1 [, column2, column3 ... ]) ЗНАЧЕНИЯ (значение1 [, значение2, значение3 ... ])

Количество столбцов и значений должно быть одинаковым. Если столбец не указан, используется значение по умолчанию для столбца. Значения, указанные (или подразумеваемые) ВСТАВЛЯТЬ оператор должен удовлетворять всем применимым ограничениям (таким как первичные ключи, ПРОВЕРИТЬ ограничения, и НЕ НОЛЬ ограничения). Если возникает синтаксическая ошибка или нарушаются какие-либо ограничения, новая строка не добавляется в таблицу и вместо нее возвращается ошибка.

Пример:

ВСТАВЛЯТЬ В телефонная книга (имя, номер) ЗНАЧЕНИЯ ('Джон Доу', '555-1212');

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

ВСТАВИТЬ В стол ЗНАЧЕНИЯ (значение1, [значение2, ... ])

Пример вставки данных в 2 столбца в таблице phone_book и игнорирования любых других столбцов, которые могут быть после первых 2 в таблице.

ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ('Джон Доу', '555-1212');

Расширенные формы

Многорядные пластины

Функция SQL (поскольку SQL-92 ) - это использование конструкторы значений строк для вставки нескольких строк в один оператор SQL:

ВСТАВЛЯТЬ В имя таблицы (столбец-а, [столбец-б, ...])ЗНАЧЕНИЯ ('значение-1а', ['значение-1b', ...]),       ('значение-2а', ['значение-2b', ...]),       ...

Эта функция поддерживается DB2, SQL Server (с версии 10.0 - т.е. 2008), PostgreSQL (начиная с версии 8.2), MySQL, SQLite (начиная с версии 3.7.11) и H2.

Пример (предполагается, что "имя" и "номер" - единственные столбцы в таблице "phone_book"):

ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ('Джон Доу', '555-1212'), ('Питер Доу', '555-2323');

что можно рассматривать как сокращение для двух утверждений

ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ('Джон Доу', '555-1212');ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ('Питер Доу', '555-2323');

Обратите внимание, что два отдельных оператора могут иметь разную семантику (особенно в отношении оператора триггеры ) и может не обеспечивать такую ​​же производительность, как одинарная многорядная вставка.

Для вставки нескольких строк в MS SQL можно использовать такую ​​конструкцию:

ВСТАВЛЯТЬВтелефонная книгаВЫБРАТЬ'Джон Доу','555-1212'СОЮЗВСЕВЫБРАТЬ'Питер Доу','555-2323';

Обратите внимание, что это недопустимый оператор SQL согласно стандарту SQL (SQL: 2003 ) из-за пункта о неполном подзапросе.

Чтобы сделать то же самое в Oracle, используйте ДВОЙНОЙ стол, который всегда состоит только из одной строки:

ВСТАВЛЯТЬ В телефонная книгаВЫБРАТЬ 'Джон Доу', '555-1212' ИЗ ДВОЙНОЙСОЮЗ ВСЕВЫБРАТЬ 'Питер Доу','555-2323' ИЗ ДВОЙНОЙ

Соответствующая стандарту реализация этой логики показывает следующий пример или как показано выше:

ВСТАВЛЯТЬ В телефонная книгаВЫБРАТЬ 'Джон Доу', '555-1212' ИЗ Боковой ( ЗНАЧЕНИЯ (1) ) В КАЧЕСТВЕ т(c)СОЮЗ ВСЕВЫБРАТЬ 'Питер Доу','555-2323' ИЗ Боковой ( ЗНАЧЕНИЯ (1) ) В КАЧЕСТВЕ т(c)

Oracle PL / SQL поддерживает ВСТАВИТЬ ВСЕ оператор, в котором несколько операторов вставки завершаются ВЫБРАТЬ:[1]

ВСТАВЛЯТЬ ВСЕВ телефонная книга ЗНАЧЕНИЯ ('Джон Доу', '555-1212')В телефонная книга ЗНАЧЕНИЯ ('Питер Доу', '555-2323')ВЫБРАТЬ * ИЗ ДВОЙНОЙ;

В Жар-птица вставка нескольких строк может быть достигнута следующим образом:

ВСТАВЛЯТЬ В телефонная книга ("имя", "номер")ВЫБРАТЬ 'Джон Доу', '555-1212' ИЗ RDB $ DATABASEСОЮЗ ВСЕВЫБРАТЬ 'Питер Доу', '555-2323' ИЗ RDB $ DATABASE;

Firebird, однако, ограничивает количество строк, которые можно вставить таким образом, поскольку существует ограничение на количество контекстов, которые можно использовать в одном запросе.

Копирование строк из других таблиц

An ВСТАВЛЯТЬ Оператор также может использоваться для извлечения данных из других таблиц, изменения их при необходимости и вставки непосредственно в таблицу. Все это делается в одном операторе SQL, который не требует какой-либо промежуточной обработки в клиентском приложении. Подзапрос используется вместо ЗНАЧЕНИЯ пункт. Подвыбор может содержать соединения, вызовы функций и даже запрашивать ту же таблицу, в которую вставлены данные. Логически выбор оценивается до начала фактической операции вставки. Пример приведен ниже.

ВСТАВЛЯТЬ В phone_book2ВЫБРАТЬ *ИЗ   телефонная книгаКУДА  имя В ('Джон Доу', 'Питер Доу')

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

ВСТАВЛЯТЬ В phone_book2 ( [имя], [телефонный номер] )ВЫБРАТЬ [имя], [телефонный номер]ИЗ   телефонная книгаКУДА  имя В ('Джон Доу', 'Питер Доу')

В ВЫБРАТЬ оператор создает (временную) таблицу, и схема этой временной таблицы должна совпадать со схемой таблицы, в которую вставляются данные.

Значения по умолчанию

Можно вставить новую строку без указания каких-либо данных, используя значения по умолчанию для всех столбцов. Однако некоторые базы данных отклоняют оператор, если данные не указаны, например Microsoft SQL Server, и в этом случае ДЕФОЛТ ключевое слово может быть использовано.

ВСТАВЛЯТЬ В телефонная книгаЗНАЧЕНИЯ ( ДЕФОЛТ )

Иногда базы данных также поддерживают для этого альтернативный синтаксис; например, MySQL позволяет опускать ДЕФОЛТ ключевое слово, и T-SQL может использовать ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ вместо ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ). ДЕФОЛТ ключевое слово также может использоваться при обычной вставке для явного заполнения столбца с использованием значения по умолчанию для этого столбца:

ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ( ДЕФОЛТ, '555-1212' )

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

Получение ключа

Разработчики баз данных, использующие суррогатный ключ поскольку первичный ключ для каждой таблицы будет работать в случайном сценарии, когда им необходимо автоматически получить первичный ключ, сгенерированный базой данных, из SQL ВСТАВЛЯТЬ оператор для использования в других операторах SQL. Большинство систем не поддерживают SQL ВСТАВЛЯТЬ операторы для возврата данных строки. Следовательно, в таких сценариях возникает необходимость в обходном пути. Общие реализации включают:

  • Использование конкретной базы данных хранимая процедура который генерирует суррогатный ключ, выполняет ВСТАВЛЯТЬ операция и, наконец, возвращает сгенерированный ключ. Например, в Microsoft SQL Server ключ извлекается через SCOPE_IDENTITY () специальная функция, а в SQLite функция называется last_insert_rowid ().
  • Использование конкретной базы данных ВЫБРАТЬ оператор для временной таблицы, содержащей последнюю вставленную строку (строки). DB2 реализует эту функцию следующим образом:
    ВЫБРАТЬ *ИЗ НОВЫЙ СТОЛ (    ВСТАВЛЯТЬ В телефонная книга    ЗНАЧЕНИЯ ( 'Питер Доу','555-2323' )) В КАЧЕСТВЕ т
    • DB2 для z / OS реализует эту возможность следующим образом.
      ВЫБРАТЬ EMPNO, HIRETYPE, ДАТА ПРИЕМА НА РАБОТУИЗ ФИНАЛЬНЫЙ СТОЛ (    ВСТАВЛЯТЬ В EMPSAMP (ИМЯ, ЗАРПЛАТА, ДЕПТНО, УРОВЕНЬ)    ЗНАЧЕНИЯ(Мэри Смит, 35000.00, 11, Партнер));
  • Используя ВЫБРАТЬ заявление после ВСТАВЛЯТЬ с функцией, зависящей от базы данных, которая возвращает сгенерированный первичный ключ для последней вставленной строки. Например, LAST_INSERT_ID () за MySQL.
  • Использование уникальной комбинации элементов из исходного SQL ВСТАВЛЯТЬ в последующем ВЫБРАТЬ утверждение.
  • Используя GUID в SQL ВСТАВЛЯТЬ заявление и получение его в ВЫБРАТЬ утверждение.
  • С использованием ВЫХОД предложение в SQL ВСТАВЛЯТЬ оператор для MS-SQL Server 2005 и MS-SQL Server 2008.
  • Используя ВСТАВЛЯТЬ заявление с ВОЗВРАЩЕНИЕ пункт для Oracle.
    ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ( 'Питер Доу','555-2323' )ВОЗВРАЩЕНИЕ phone_book_id В v_pb_id
  • Используя ВСТАВЛЯТЬ заявление с ВОЗВРАЩЕНИЕ пункт для PostgreSQL (начиная с версии 8.2). Возвращенный список идентичен результату ВСТАВЛЯТЬ.
    • Жар-птица имеет такой же синтаксис в операторах языка модификации данных (DSQL); оператор может добавить не более одной строки.[2] В хранимых процедурах, триггерах и исполнительных блоках (PSQL) используется вышеупомянутый синтаксис Oracle.[3]
      ВСТАВЛЯТЬ В телефонная книга ЗНАЧЕНИЯ ( 'Питер Доу','555-2323' )ВОЗВРАЩЕНИЕ phone_book_id
  • С использованием ЛИЧНОСТЬ() функционировать в H2 возвращает последний вставленный идентификатор.
    ВЫБРАТЬ ЛИЧНОСТЬ();

Триггеры

Если триггеры определены в таблице, на которой ВСТАВЛЯТЬ оператор работает, эти триггеры оцениваются в контексте операции. ПЕРЕД ВСТАВКОЙ триггеры позволяют изменять значения, которые должны быть вставлены в таблицу. ПОСЛЕ ВСТАВКИ триггеры больше не могут изменять данные, но могут использоваться для инициирования действий с другими таблицами, например, для реализации механизма аудита.

Рекомендации

  1. ^ "Oracle PL / SQL: ВСТАВИТЬ ВСЕ". psoug.org. Получено 2010-09-02.
  2. ^ "Обновление справочника по языку Firebird 2.5". Получено 2011-10-24.
  3. ^ "Словарь языка SQL Firebird".

внешняя ссылка