Добавление данных
15. Добавление данных
Другим часто используемым оператором SQL является оператор INSERT. Этот оператор используется для ввода (добавления) строк в таблицу базы данных. Добавление можно осуществлять несколькими способами:
· добавить одну полную строку;
· добавить часть одной строки;
· добавить результаты запроса.
Для использования оператора INSERT могут потребоваться особые права на доступ в СУБД со структурой клиент-сервер.
Для Access необходимо:
1. Установить доверие базе данных (на сеанс). Для этого:
Предупреждение системы безопасности Параметры… Включить это содержание - включить
Рекомендуемые материалы
2. Для отмены запросов на подтверждение установить:
Офис Параметры Access Дополнительно Подтверждение запрос на изменение - снять включение.
3. Запрос можно сохранить, а затем выполнять.
4. После выполнения запроса на добавление, добавленную строку из таблицы надо удалить, в противном случае следующие запросы будут выдавать диагностическое сообщение.
15.1. Добавление полных строк
Для добавления строк в операторе INSERT нужно указать имя таблицы и значения, которые должны быть введены в новую строку.
Пример. В таблицу Клиентов надо добавить сведения о клиенте.
INSERT INTO Customers
VALUES (‘1000000006’,
‘Toy Land’,
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’,
NULL,
NULL);
Данные, которые должны быть сохранены в каждом столбце, указываются в условии VALUES, значения должны быть приведены для каждого столбца. Если для какого-то столбца не имеется соответствующего значения, следует использовать значение NULL, если для данной таблицы разрешено не указывать значения в этих столбцах. Столбцы должны заполняться в порядке, в котором они появились в определении таблицы.
Ключевое слово INTO в некоторых реализациях является не обязательным. Однако хорошим тоном считается указание этого ключевого слова всегда, этим обеспечивается переносимость кода между СУБД.
Этот синтаксис довольно прост, но он не вполне безопасен. Результаты применения весьма чувствительны к порядку, в котором столбцы определены в таблице. Они также зависят от того, соблюдается ли в действительности этот порядок. Даже если в данный момент порядок соблюдается, то нет гарантий, что столбцы будут расположены в том же самом порядке, когда таблица будет реконструироваться в следующий раз.
Безопасный, но более громоздкий способ записи оператора INSERT таков.
INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country,
cust_contact,
cust_email)
VALUES (‘1000000006’,
‘Toy Land’
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’,
NULL,
NULL);
Здесь имена столбцов явно указаны в круглых скобках, следующих после имени таблицы. Когда строка вводится в таблицу, СУБД устанавливает соответствие каждого предмета в списке столбцов с соответствующим значением в списке VALUES. Первое значение в списке соответствует первому указанному имени столбца, второе значение соответствует имени второго столбца и т.д.
Поскольку имена столбцов представлены, условие VALUES должно подобрать названные имена столбцов в порядке, в котором указаны столбцы, причем не обязательно в порядке, в котором они следуют в реальной таблице. Преимущество этого способа таково, что даже если расположение столбцов в таблице изменится, оператор INSERT все равно будет работать корректно.
Следующий пример заполняет все столбцы строки, как и в предыдущем примере, но делает это в другом порядке.
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country)
VALUES (‘1000000006’,
NULL,
NULL,
‘Toy Land’
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’);
15.2. Добавление части строки
Используя синтаксис с явным указанием имени столбцов таблицы, можем пропустить некоторые столбцы. Это означает, что вводятся значения для одних столбцов и не вводятся для других.
Рассмотрим следующий пример.
INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country)
VALUES (‘1000000006’,
‘Toy Land’
‘123 Any Street’,
‘New York’,
‘NY’,
‘11111’,
‘USA’);
В примере значения не предполагаются для двух столбцов cust_contact и cust_email.
При исключении некоторых столбцов из операции INSERT, если это позволяет делать определение таблицы, должно соблюдаться одно из следующих условий:
· этот столбец определен как допускающий значение NULL (отсутствие какого-либо значения);
· в определении таблицы указано значение по умолчанию. Это означает, что, если не указано никакое значение, будет использовано значение по умолчанию.
Если пропускается столбец таблицы, которая не допускает появление в своих строках значений NULL и не имеет значения, определенного для использования по умолчанию, СУБД выдает сообщение об ошибке, и эта строка не будет добавлена.
15.3. Добавление выбранных данных
Обычно оператор INSERT служит для добавления строки в таблицу с использованием указанных значений. Существует и другая форма оператора INSERT, она может быть использована для добавления в таблицу результата применения оператора SELECT.
Эта форма известна как оператор INSERT SELECT и данный оператор выполняет то же самое, что делают операторы INSERT и SELECT.
Пример. Нужно ввести в таблицу Customers список клиентов из другой таблицы. Вместо того чтобы считывать по одной строке и затем добавлять ее посредством оператора INSERT , но лучше сделать следующее – данные импортировать из таблицы с помощью INSERT.
Данные будут импортироваться из таблицы CustNew. Поэтому сначала создается и наполняется таблица CustNew. Формат таблицы должен быть таким же, как и таблица Customers. При заполнении необходимо следить, чтобы не были использованы значения cust_id, которые уже есть в таблице Customers.
cust_id 1000000007 1000000009 1000000008
cust_name Toy Land Village Toys Fun4All
cust_address 456 Any Street 829 Riverside Drive 123 Any Street
cust_city New York Chicago New York
cust_state NN IL NY
cust_ZIP 77777 99999 22222
cust_country USA USA USA
cust_contact Jim Smith Jim Jones NULL
cust_email NULL jjones@fun4all.com NULL
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country
FROM CustNew;
В этом примере для импорта всех данных из таблицы CustNew в таблицу Customers используется оператор INSERT SELECT. Вместо того, чтобы перечислять значения, которые должны быть добавлены, оператор SELECT выбирает их из таблицы CustNew. Каждый столбец в операторе SELECT соответствует столбцу в списке указанных столбцов. Добавлены будут все данные таблицы CustNew.
Следует иметь в виду, что СУБД не обращает внимания на имена столбцов, возвращаемых оператором SELECT. Используется положение столбца, так что первый столбец в SELECT, независимо от имени, будет использован для заполнения первого указанного столбца таблицы.
Оператор SELECT, используемый в INSERT SELECT, может включать предложение WHERE для фильтрации данных, которые должны быть добавлены.
15.4. Копирование данных из одной таблицы в другую
Это – другая форма добавления данных, при которой оператор INSERT не применяется. Чтобы скопировать содержимое какой-то таблицы в новую таблицу, которая создается в процессе выполнения оператора, можно использовать оператор SELECT INTO.
В отличие от оператора INSERT SELECT, который данные добавляет в уже существующую таблицу, SELECT INTO копирует данные в новую таблицу, а в ряде СУБД может переписать таблицу, если такая уже существует.
Отличие между операторами: SELECT INTO экспортирует данные, INSERT SELECT – импортирует.
Пример. Применение оператора SELECT INTO.
SELECT *
INTO CustCopy
FROM Customers;
Этот оператор SELECT создает новую таблицу с именем CUSTCopy и копирует в нее все содержимое таблицы Customers. Чтобы скопировать только часит стобцов, следует явно указать имена столбцов, а не использовать *.
В СУБД MySQL и Oracle используется иной синтаксис.
CREATE NABLE CustCopy AS
"Лекция 1" - тут тоже много полезного для Вас.
SELECT *
FROM Customers;
При использовании оператора SELECT INTO слкдует учитывать:
· можно использовать любые опции и предложения оператора SELECT, включая WHERE и GROUP BY;
· для добавления данных из нескольких таблиц можно использовать объединение;
· данные можно добавлять только в одну таблицу независимо от того, из скольких таблиц они были извлечены.