Запрос INSERT можно представить в следующем обобщенном виде:
INSERT INTO { базовая таблица представление} [(столбец1 [, столбец2] ...)] {VALUES ({константа1 переменная1} [,{константа2 переменная1}] ) <табличный подзапрос>} RETURNING <список столбцов> [INTO <список переменных>]];.
Предложение INTO определяет таблицу или представление и столбцы, в которые будут вставлены строки. При однократном использовании однострочного запроса INSERT в таблицу или представление можно вставить только одну строку. Если применить запрос INSERT с вложенным запросом SELECT (многострочный запрос INSERT), то с помощью одного запроса можно вставить в таблицу или представление сразу несколько строк из другой таблицы.
Предложение RETURNING позволяет запоминать значения необходимых столбцов в изменяемой строке. Его использование во всех запросах модификации данных (INSERT, UPDATE OR INSERT, UPDATE, DELETE) будет подробнее рассмотрено при изучении процедурного языка.
5.1.1. Однострочный запрос INSERT
Формат однострочного запроса INSERT имеет следующий вид:
INSERT INTO { базовая таблица представление} [(столбец1 [, столбец2] ...)] VALUES ({константа1 переменная1} [,{константа2 переменная2}] ...) RETURNING <список столбцов> [INTO <список переменных>]];.
В таблицу или представление вставляется строка со значениями полей, указанными в перечне предложения VALUES (значения), причем i-е значение соответствует i-му столбцу в списке столбцов. Столбцы, не указанные в списке, заполняются значениями по умолчанию или NULL-значениями, если ограничение, наложенное на столбец, позволяет вставку NULL-значений. Если допустимы NULL-значения и определено значение по умолчанию, вставлено будет значение по умолчанию. Если NULL-значения не допустимы и не определено значение по умолчанию, то запрос на вставку без явного указания значения такого столбца выполнен не будет. Следует также отметить, что если NULL-значения не допустимы, то можно ввести, например, пустую строку для символьного столбца, однако такой подмены делать не рекомендуется.
Рассмотрим вставку строки в таблицу при полном указании списка ее столбцов. Например, для вставки строки в таблицу Abonent можно использовать следующий запрос:
INSERT INTO Abonent (AccountCD, StreetCD, HouseNO,
FlatNO, Fio, Phone)
VALUES (50000, 8, 1, 1, ПЛИТОВ Е.Д.,556787);.
Если в списке предложения VALUES указаны значения для всех столбцов модифицируемой таблицы и порядок их перечисления соответствует порядку столбцов в описании таблицы (как в предыдущем примере), то список столбцов в предложении INTO можно опустить. Например, предыдущий оператор вставки строки в таблицу Abonent можно записать следующим образом: INSERT INTO Abonent
VALUES (50000, 8, 1, 1, ПЛИТОВ Е.Д., 556787);.
Если требуется ввести NULL-значение, например, в поле Phone (номер телефона абонента неизвестен), то оно вводится точно так же, как и обычное значение, например:
INSERT INTO Abonent
VALUES (50000, 8, 1, 1, ПЛИТОВ Е.Д., NULL); .
В приведенных выше примерах значения, помещаемые в таблицу, располагаются в том порядке, в котором они были созданы запросом CREATE TABLE. Но в некоторых случаях требуется поменять порядок вводимых значений или вводить значения не во все столбцы в таблице. Чтобы удовлетворить этому условию, требуется явно указывать имена и порядок столбцов. Примером этому может служить следующий запрос: INSERT INTO Abonent (AccountCD, StreetCD, Fio)
VALUES (50000, 8, ПЛИТОВ Е. Д.);.
5.1.2. Многострочный запрос INSERT
Для вставки в одну таблицу или представление нескольких строк из другой таблицы следует использовать так называемый многострочный запрос INSERT, формат которого имеет следующий вид:
INSERT INTO { базовая таблица представление} [(столбец1 [, столбец2] ...)] <табличный подзапрос> RETURNING <список столбцов> [INTO <список переменных>]];.
В этом формате запроса INSERT сначала выполняется подзапрос SELECT, представляющий собой <табличный подзапрос>, с помощью которого в памяти формируется рабочая таблица, а затем строки рабочей таблицы загружаются в модифицируемую таблицу или представление. При этом i-й столбец рабочей таблицы соответствует i-му столбцу в списке столбцов модифицируемой таблицы или представления. При использовании многострочного запроса INSERT требуется следить за тем, чтобы тип и количество значений,
возвращаемых подзапросом, совпадали с типом и количеством столбцов в модифицируемой таблице.
Пусть имеется пустая таблица Fio со столбцами abonentname и executorname, определёнными на типе данных VARCHAR(20). В эту таблицу необходимо поместить фамилии абонентов и исполнителей каждой из ремонтных заявок. Для этого можно применить следующий запрос: INSERT INTO Fio (Abonent name, Executor name)
SELECT A.Fio, E.Fio
FROM Abonent A, Executor E, Request R
WHERE R.AccountCD = A.AccountCD AND
R.ExecutorCD = E.ExecutorCD;.
В предложении FROM подзапроса SELECT может быть указана не базовая таблица, а представление. Таким образом, можно вставлять данные из представления в базовую таблицу. Например, если ранее было создано представление AbonentExecutor со столбцами abonentname и executorname, то предыдущий запрос можно переписать следующим образом: INSERT INTO Fio
SELECT Abonent name, Executor name FROM Abonent Executor;.
Содержание таблицы Fio после вставки будет совпадать с данными, приведенными ранее на рис. 4.8, так как фактически в таблицу Fio внесены все данные ранее созданного представления AbonentExecutor.
В подзапросах, используемых в многострочном запросе INSERT, можно использовать предложение UNION. Пусть имеется таблица Phone со столбцами AbonentFio, OldTel и NewTel, определёнными на типе данных VARCHAR(20), VARCHAR(15) и VARCHAR(15) соответственно. Известно, что в номерах телефона, где первые две цифры были 25, эти цифры стали теперь равны 14, а где были 68 - стали равны 57. В таблицу Phone необходимо поместить фамилии абонентов, у которых изменился номер телефона, а также старые и новые номера телефонов. Для этого можно применить следующий запрос:
INSERT INTO Phone (Abonent Fio, Old Tel, New Tel) SELECT Fio, Phone, 14 TRIM (LEADING 25 FROM Phone)
FROM Abonent
WHERE SUBSTRING(Phone FROM 1 FOR 2)= 25 UNION
SELECT Fio, Phone, 57 TRIM (LEADING 68 FROM Phone)
FROM Abonent
WHERE SUBSTRING(Phone FROM 1 FOR 2)= 68;.
Дата: 2019-02-02, просмотров: 235.