11.1. Внесение изменений в базу данных
Язык SQL позволяет не только извлекать информацию из БД с помощью запросов на чтение, но и изменять содержащуюся в ней информацию с помощью запросов на добавление, удаление и обновление.
По сравнению с оператором SELECT, задающим запросы на чтение, операторы языка SQL, изменяющие содержимое БД, являются более простыми. Однако при изменении содержимого БД к СУБД предъявляется ряд дополнительных требований. При внесении изменений СУБД должна сохранять целостность данных и разрешать ввод в БД только допустимых значений, а также обеспечивать возможность одновременного изменения БД несколькими пользователями, чтобы они не мешали друг другу.
11.1.1. Добавление новых данных
Наименьшей единицей информации, которую можно добавить в реляционную БД, является одна строка. Существует два способа добавления новых строк в БД:
однострочный оператор INSERT позволяет добавить в таблицу новую строку (рис.11.1);
многострочный оператор INSERT обеспечивает извлечение строк из одной части БД и добавление их в другую таблицу (рис.11.2).
INSERT INTOимя_таблицы
( имя_столбца )
,
VALUES (константа )
NULL
,
Рис. 11.1. Однострочный оператор INSERT
В предложении INTO указывается целевая таблица, в которую добавляется новая строка, а в предложении VALUES содержатся значения данных для новой строки. Список столбцов определяет, какие значения в какой столбец заносятся.
Например, можно задать запросы для внесения в БД сведений о новой квартире, установке телефона в этой квартире и заселении этой квартиры новым жильцом:
INSERT INTO FLAT
VALUES (‘Зеленоград, 1001-45’, 40, 3,’H’)
INSERT INTO TPHONE (ADR, NTEL, TCATEGORY)
VALUES (‘Зеленоград,1001-45’, ’999-1199’, ’С’)
INSERT INTO PERSON (NOM, FIO, RDATE, POL, ADR)
VALUES (14,’Кукушкин Жан Ильич’,’03/13/77’,’M’,’Зеленоград,1001-45’)
Если список столбцов опущен, то последовательность значений данных должна точно соответствовать порядку столбцов в таблице (см. (1)).
В списке столбцов их имена могут указываться в любой удобной последовательности, определяющей затем порядок значений данных в предложении VALUES (см.(2)).
При добавлении в таблицу новой строки всем столбцам, имена которых отсутствуют в списке столбцов оператора INSERT, СУБД автоматически присваивает значение NULL либо значение, заданное по умолчанию при описании структуры таблицы (см.(3), где отсутствует имя столбца SUMD).
Список столбцов в операторе INSERT служит, чтобы установить соответствие между значениями данных, содержащимися в предложении VALUES, и столбцами, для которых эти данные предназначены. Списки значений и столбцов должны содержать одинаковое число элементов, а тип данных каждого значения должен соответствовать типу соответствующего столбца.
INSERT INTO имя_таблицы запрос
( имя_столбца )
,
Рис. 11.2. Многострочный оператор INSERT
Многострочный оператор INSERT добавляет в целевую таблицу одну или несколько строк. Источником новых строк служит запрос на чтение, содержащийся внутри оператора INSERT.
Например, можно добавить в таблицу PERSON сведения о новом жителе, у которого общий доход будет таким же, как у жителя с номером 16:
INSERT INTO PERSON
SELECT 20,’АЛОВ НАУМ НИЛЫЧ’,’05/20/49’,’M’, SUM (MONEYS),
‘Зеленоград, 1001-45’ FROM HAVE_D, PROFIT
WHERE NOM=16 AND HAVE_D.ID=PROFIT.ID
Такой способ определения общего дохода у жителя с номером 16, требующий осуществления соединения двух таблиц и использования агрегатной функции, обусловлен стандартом SQL1, который требует, чтобы имя целевой таблицы оператора INSERT не присутствовало в предложении FROM запроса, вложенного в него, т. е. запрещается добавление таблицы самой в себя.
В стандарте SQL2 это ограничение отсутствует и ''самодобавление'' разрешено. Следовательно, рассмотренный пример можно модифицировать следующим образом: INSERT INTO PERSON
SELECT 20,’ АЛОВ НАУМ НИЛЫЧ ’,’05/20/49’,
’M’ ,SUMD,’Зеленоград,1001-45’
FROM PERSON WHERE NOM=16