- •Добавление, удаление и изменение данных в таблицах
- •Добавление новых записей
- •Insert into имяТаблицы values (списокЗначений)
- •Insert into имяТаблицы (списокСтолбцов) values (списокЗначений)
- •Insert into имяТаблицы (имяЛюбогоСтолбца) values (null)
- •Удаление записей
- •Insert into Клиенты (Имя, Телефон, Сумма_заказа)
- •Insert into имяТаблицы (списокСтолбцов) select …
- •Insert into Клиенты (Имя, Адрес, Телефон)
- •Insert into Клиенты (Имя, Адрес, Телефон)
- •Изменение данных
- •Проверка ссылочной целостности
Insert into Клиенты (Имя, Телефон, Сумма_заказа)
values
('Петров', '444-4444', 25300),
('Иванов', '555-5555', 45100),
('Сидоров', '777-7777', 1200),
('Захаров', '423-9870', 7800);
Следующий формат вставляет в указанную таблицу записи, возвращаемые запросом на выборку.
Insert into имяТаблицы (списокСтолбцов) select …
На практике нередко требуется загрузить в одну таблицу данные из другой таблицы. Например, ранее созданная таблица Контакты содержит имена и другие данные о клиентах, которые необходимо вставить в таблицу Клиенты. Для этого в операторе insert вместо values можно использовать оператор select, выбирающий записи, необходимые для вставки.
Допустим, таблицы Клиенты и Контакты имеют одноименные и однотипные столбцы Имя, Адрес и Телефон. Требуется добавить все записи из таблицы Контакты в таблицу Клиенты. Это можно сделать с помощью следующего запроса:
Insert into Клиенты (Имя, Адрес, Телефон)
select Имя, Адрес, Телефон from Контакты;
Следующий запрос вставляет в таблицу клиенты только те записи из таблицы контакты, которых в ней еще нет. Таким образом, происходит дополнение первой таблицы данными из второй таблицы:
Insert into Клиенты (Имя, Адрес, Телефон)
select Имя, Адрес, Телефон from Контакты
where Клиенты.Имя < > Контакты.Имя and
Клиенты.Адрес < > Контакты.Адрес and
Контакты.Имя is not null;
Здесь в операторе where применено сложное условие на случай, если в таблицах окажутся однофамильцы или в таблице Контакты окажутся неопределенные имена. С помощью оператора insert можно добавить одну или несколько записей только в одну таблицу. Кроме того, необходимо учитывать следующие обстоятельства:
таблица может иметь столбец типа serial (счетчик), имеющий уникальные значения, которые СУБД назначает автоматически. Это обеспечивает уникальность всех записей таблицы и, следовательно, ее соответствие 1-ой нормальной форме. Поэтому в списке столбцов в операторе insert не следует указывать столбцы типа serial;
если список столбцов, указанный в операторе insert, содержит не все столбцы таблицы, то в оставшиеся столбцы (за исключением столбца типа serial) будут введены значения null (неопределенное значение), а в столбец типа serial правильное числовое значение введет СУБД;
при введении значений в столбцы новой записи необходимо следить, чтобы типы значений соответствовали типам столбцов таблицы. При необходимости можно воспользоваться функцией преобразования типов cast ();
таблица может иметь ограничения и если вводимые данные не удовлетворяют условиям этих ограничений, то запрос на добавление данных не будет выполнен. Так, например, если в ограничении на какой-либо столбец указано, что он не может иметь значения null, то попытка добавить пустую запись приведет к ошибке. В этом случае необходимо использовать оператор insert into с ключевым словом values, чтобы сразу ввести значение, удовлетворяющее ограничениям.
Удаление записей
Для удаления записей из таблицы применяется оператор delete (удалить):
delete from имяТаблицы where условие;
Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию (логическое выражение).
Следующий запрос удаляет записи из таблицы Клиенты, в которой значение столбца Имя равно 'Иванов':
delete prom Клиенты where Имя = 'Иванов';
Если таблица Клиенты содержит несколько записей, в которых есть клиент Иванов, то все они будут удалены. В операторе where может находиться подзапрос на выборку данных (оператор select). Подзапросы в операторе delete работают точно так же, как и в операторе select.
Пусть в базе данных имеется таблица Продажи (ID_товара, Сумма_заказа, ID_клиента), содержащая сведения о продажах товаров клиентам. Требуется удалить из этой таблицы записи о тех клиентах, которые приобрели товары на сумму, меньшую 1000. Для этого можно использовать такой запрос:
delete from Продажи Т1 where 1000 >=
(select sum(Т2.Сумма_заказа) from Продажи Т2 where T1. ID_клиента= Т2. ID_клиента);
Здесь запрос на удаление записей из таблицы Продажи содержит связанный (коррелированный) подзапрос, вычисляющий сумму значений столбца Сумма_заказа. Обратите внимание на использование двух различных псевдонимов для одной и той же таблицы. При выполнении данного запроса на удаление происходит, как и положено в случае связанных подзапросов, последовательный просмотр записей в таблице Продажи. Для каждой записи проверяется условие оператора where, а именно выполняется подзапрос, вычисляющий сумму значений столбца Сумма_заказа для всех записей, в которых идентификатор клиента равен значению этого идентификатора в текущей записи (текущей называется запись, просматриваемая в данный момент). Если вычисленное значение не превышает 1000, то условие оператора where выполняется и текущая запись удаляется, в противном случае запись не удаляется. Далее происходит переход к следующей записи, рассматриваемой в качестве текущей, и описанные действия повторяются снова.
Теперь рассмотрим пример, в котором требуется удалить записи в одной таблице в соответствии с условием, обрабатывающим записи в другой таблице. Допустим, в базе данных имеются две таблицы:
Продажи (ID_товара, Сумма_заказа, ID_клиента);
Клиенты (ID_клиента, Имя, Адрес).
Требуется удалить из таблицы Клиенты те записи о клиентах, которые приобрели товары на сумму, меньшую 1000. Суммы заказов клиентов содержатся в таблице Продажи, а записи необходимо удалять из таблицы Клиенты, в которой нет данных о приобретенных товарах. Тем не менее, для решения этой задачи можно использовать запрос, аналогичный предыдущему:
delete from Клиенты T1
where 1000 >=
(select sum(Т2.Сумма_заказа) from Продажи Т2
where T1. ID_клиента= Т2. ID_клиента);
Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQL-выражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку:
select * from Клиенты T1
where 1000 >=
(select sum(Т2.Сумма_заказа) from Продажи Т2
where T1. ID_клиента= Т2. ID_клиента);
Для удаления всех записей из таблицы достаточно использовать оператор delete без ключевого слова where. При этом сама таблица со всеми определенными в ней столбцами остается и готова для вставки новых записей. Например: delete from Клиенты;
Внимание. Таблица может иметь ограничения, которые могут препятствовать удалению некоторых или всех записей.
