Программирование >>  Руководство по sql 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 105


штат). Данные после ключевого слова VALUES заключаются в круглые скобки. В большинстве систем значения вводятся в двойных или одинарных кавычках и разделяются запятыми.

Для каждой добавляемой строки используется отдельный оператор INSERT.

Вставка данных в несколько столбцов. Если данные добавляются не во все столбцы таблицы, их нужно дополнительно определить. Во избежание сбоев, для столбцов, значения которых не вводятся, должны быть определены значения по умолчанию либо они должны допускать нулевые значения. Например, для добавления данных только в два столбца (скажем, в pubid и риЬ пате) используется следующая команда:

SQL:

insert into publishers (pub id, pub name) values (1756, HealthText)

Порядок перечисления столбцов в операторе INSERT может быть любым, но при этом он должен соответствовать порядку перечисления значений. Например, тот же результат достигается при выполнении следующего оператора (в нем переставлены столбцы риЬ пате и pub id):

SQL:

insert into publishers (pub name, pub id) values (HealthText, 1756)

Оба этих оператора помещают значение 1756 в столбец идентификационных номеров и HeakhText в столбец имен издателей. А что будет со столбцами address, city и statel Добавленную в таблицу publishers строку можно просмотреть с помошью следующего оператора SELECT:

SQL:

select pub id, pub narae, address, city, state

from publishers

where pub name = HealthText

Результат:

pub id pub name address city state

1756 HealthText NULL NULL NULL

Так как в операторе INSERT не определены значения для столбцов address, city и state, а таблица publishers допускает использование для них нулевых значений, они будут обнулены. Если в вашей системе не разрешается использование нулевых значений, вместо пропущенных данных вы, скорее всего, увидите пробелы или обычные ноли.

Если в операторе CREATE TABLE для столбцов city и state определен ненулевой статус, предыдущий оператор INSERT не сработает, так как для таких столбцов должны вводиться все значения. Попытка выполнить в Transact-SQL оператор INSERT, в котором не определяется значение для столбца pubJd (получившего при создании таблицы publishers ненулевой статус), приведет к следующим результатам:

SQL:

insert into publishers (pub name, address, city, state) values {Tweedledum Books, 1 23rd St., New York, NY)

Результат:

column pub id in table publishers cannot be NULL (столбец pub id в таблице publishers не может быть нулевым)



Использование оператора SELECT в команде INSERT

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

INSERT INTO имя таблицы [(вставляемый список столбцов)] SELECT список стопбцов

FROM список таблиц

WHERE условия

Оператор SELECT в команде INSERT позволяет взять данные из нескольких или всех столбцов одной таблицы и вставить их в другую таблицу. Если вы вставляете значения только для части столбцов, определить значения для других столбцов можно будет позднее с помощью оператора UPDATE.

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

Если столбцы в обеих таблицах совместимы по типам и определены в одинаковом порядке в соответствующих операторах CREATE TABLE, перечислять их в команде INSERT необязательно. Предположим, что в таблице newauthors содержатся строки с информацией об авторах в том же формате, что и в таблице authors. Для добавления всех строк из таблицы newauthors в таблицу authors можно воспользоваться одной из следующих команд:

SQL:

insert into authors

select au id, au lname, au fname, phone, address, city, state, zip from newauthors

insert into authors

select *

from newauthors

Если столбцы в двух таблицах (таблица, в которую вы вставляете данные, и таблица, из которой вы берете данные) определены в разном порядке в соответствующих операторах CREATE TABLE, для установления соответствия между ними можно воспользоваться предложениями INSERT или SELECT.

Например, предположим, что в операторе CREATE TABLE для таблицы authors столбцы определены в следующем порядке - auid, аи Jname, aujname и address, а для таблицы newauthors - auJd, address, аиJname и aujname. Тогда установить соответствие между ними можно с помощью оператора INSERT. Для этого столбцы таблицы authors нужно перечислить в предложении INSERT:

SQL:

insert into authors (au id, address, au lname, au fname) select * from newauthors

Такой же результат можно получить, перечислив в нужном порядке столбцы таблицы newauthors в предложении SELECT:

SQL:

insert into authors

select au id, au fname, au lname, address from newauthors

Если последовательности столбцов в двух таблицах не согласованы, операция INSERT либо не будет выполняться вообще, либо выполнится не полностью. При этом данные могут быть размещены в неверных столбцах. Например, вы вряд ли захотите, чтобы информация об адресе попала в столбец aujname.



Выражения. Одним из преимуществ использования оператора SELECT в команде INSERT является возможность включения в него различных выражений (expression) - строк символов, математических формул и функций, позволяющих манипулировать вставляемыми данными. (Подробная информация об этом содержится в главах 4-8.)

Ниже приводится пример предложения SELECT, в котором над столбцом выполняются математические действия. Предположим, что один из филиалов описываемой нами компании перекупил серию книг у другой издательской компании. Причем, по счастливой случайности, для описания книг эта компания использовала таблицу с той же структурой, что и таблица titles. Эти книги описаны в таблице Books и их нужно поместить в таблицу titles. Однако при покупке стоимость этих книг была увеличена на 50%. Оператор, увеличивающий значения стоимости книг и вставляющий строки из таблицы Books в таблицу titles, имеет следующий вид:

SQL:

insert into titles

select title id, title, type, pub id, price * 1.5, advance, royalty, ytd sales, contract, notes, pubdate from Books

Вставка данных в несколько столбцов. С помощью оператора SELECT можно добавлять данные как во все сразу, так и в отдельные столбцы, по аналогии с предложением VALUE. Для этого нужно просто задать имена столбцов, в которые вы хотите добавить данные в предложении INSERT.

Например, если в таблице titles имеются книги, на которые еще не заключены контракты, и которые, следовательно, не представлены соответствующими строками в таблице titleauthors, тогда для выборки идентификационных номеров из таблицы titles и вставки их в таблицу titleauthors (пока просто для резервирования места) можно воспользоваться следующим оператором:

SQL:

insert into titleauthors (title id) select title id

from titles

where contract = 0

Однако в этот оператор закралась ощибка, так как необходимо ввести значение в столбец au id таблицы titleauthors (согласно определению этой таблицы, в столбце auid не допускаются нулевые значения и для него не определены значения по умолчанию). Поэтому в столбец au id в виде константы надо поместить фиктивное значение (dummy value), например хххххх:

SQL:

insert into titleauthors (title id, au id) select title id, xxxxxx from titles where contract = 0

В результате выполнения этой команды таблица titleauthors будет содержать две новые строки с реальными значениями в столбце titlejd, фиктивными значениями в столбце auJd и нулевыми значениями в двух других столбцах. Однако это не сработает, если по столбцу построен уникальный индекс или на него наложены Офаничения UNIQUE или PRIMARY KEY.

В большинстве версий SQL не допускается использование одной и той же таблицы для выборки и вставки данных:

SQL:

insert into test select * from test

Sybase SQL Server - одна из немногих систем, допускающих подобный синтаксис. Глава 3. Создание и заполнение базы данных 67



1 ... 18 19 20 [ 21 ] 22 23 24 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика