Изменение существующих данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Изменение существующих данных



 

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

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

Например, чтобы изменить оценки всех студентов на 5, необходимо использовать команду:

UPDATE USP

SET OCENKA = 5;

Конечно, гораздо чаще приходится указывать не все, а только определенные строки таблицы для изменения единственного значения, и с этой целью вместе с UPDATE можно использовать предикаты. Например, изменить оценки на 5 по предмету с кодом 2003, можно выполнив такую команду:

UPDATE USP

SET OCENKA = 5

WHERE PNUM = 2003;

При помощи команды UPDATE можно модифицировать данные из нескольких полей - предложение SET может назначать! любое число столбцов, отделяемых запятыми. Все указанные назначения могут быть сделаны для любой табличной строки, но только для одной в каждый момент времени. Предположим, что преподаватель Никулина ушла на пенсию, и вместо нее занятия должна вести преподаватель Федченко.

Эта команда передаст новому преподавателю Федченко все текущие учебные предметы из таблицы PREDMET - в нашем примере это будет физика. Однако имейте в виду, что модифицировать сразу много таблиц в одной команде UPDATE нельзя, а следовательно, нельзя и использовать название (префикс) таблицы с именем поля для этой команды. Т.е., например, предложение SET TEACHERS. TFAM = ' Федченко' вызовет ошибку.

В предложении SET команды UPDATE можно использовать, выражения, располагая их в списке для того поля, которое необходимо изменить (напомним, что в предложении VALUES команды INSERT выражения использовать нельзя). Например, для того, чтобы увеличить стипендию в 2 раза, можно использовать следующую конструкцию:

UPDATE STUDENTS

SET STIP = STIP*2;

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

Кроме того, можно использовать более сложные предикаты выбора записи для модификации. Например, если необходимо удвоить только стипендию размером 25.50, то команда будет следующей:

UPDATE STUDENTS

SET STIP = STIP*2 WHERE STIP =25.50;

и будут изменены только удовлетворяющие предикату значения.

Кстати говоря, команда UPDATE может работать с NULL значениями. Т.к. предложение SET не является предикатом, то можно вводить NULL значения так же, как вводятся обыкновенные данные. Так что, если необходимо изменить все оценки студентов по учебному предмету с кодом 2003 на NULL, можно воспользоваться следующей командой:

UPDATE USP

SET OCENKA = NULL WHERE PNUM ⌠ 2003;

Мощным средством модификации данных является использование подзапросов в команде модификации UPDATE. Важный принцип, который надо соблюдать при работе с командами модификации и подзапросами, состоит в том, что нельзя в предложении FROM любого подзапроса модифицировать таблицу, к которой ссылается основная команда.

Обратите внимание на следующий важный момент - в команде модификации UPDATE (кстати, так же, как и в команде INSERT) может возникнуть проблематичная ситуация, связанная с возможными дубликатами строк, получаемыми в результате вложенного запроса. В этом случае, если в модифицируемой таблице есть ограничения, которые вынуждают ее значения быть уникальными, команда модификации или вставки потерпит неудачу. Поэтому рекомендуется каким-либо образом выяснить то, что эти значения могли были уже быть использованы в таблице, прежде чем пытаться вставить или модифицировать запись. Это можно реализовать с помощью добавления вложенного подзапроса, использующего в предикате операторы EXISTS, IN, < > или аналогичные.

С другой стороны, не стоит забывать о запрещении ссылки во вложенных запросах к таблице, которая модифицируется командой UPDATE. По этой причине запросы и подзапросы в командах модификации имеют порой достаточно сложную структуру. Кроме того, внутри необязательного предиката этой команды можно использовать соотнесенные подзапросы, аналогично тому, как это делается для delete.

Например, следующий запрос увеличивает размер стипендии в 2 раза студентам, у которых имеются оценки, по крайней мере, по двум учебным предметам:

UPDATE STUDENTS

SET STIP = STIP*2 WHERE 2 <=

(SELECT COUNT (SNUM) FROM USP WHERE STUDENTS.SNUM = USP.SNUM);

Здесь внутренний запрос подсчитывает количество записей в таблице успеваемости для каждого студента, и, если оно 2 или больше, предикат основной функции становится истинным, а размер стипендии модифицируется.

Рассмотрим еще один, достаточно сложный, пример с соотнесенным подзапросом. Здесь будем модифицировать размер стипендии для студентов, имеющих минимальный балл в тот или иной день:

UPDATE STUDENTS

SET STIP = STIP √ 1

WHERE SNUM IN

(SELECT SNUM

FROM USP FIRST

WHERE OCENKA =

(SELECT MIN (OCENKA)

FROM USP SECOND

WHERE FIRST.UDATE =SECOND.UDATE));

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

SELECT AVG (OCENKA) FROM USP;

a затем результат этого запроса (4.2) использовать для модификации

UPDATE USP

SET OCENKA = OCENKA - 1 WHERE OCENKA < 4.2

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

 


Тема 12. Специальные аспекты работы с БД. Процедура индексирования. Создание процедур и функций. Контроль целостности данных с использованием триггеров. Средства обработки транзакций. Методы блокировки.

 

Лекции: 4 часа

 

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

Язык SQL/92 позволяет определить ограничения целостности, относящиеся к общему состоянию базы данных и включающие ссылки на произвольное число таблиц. Семантика таких ограничений целостности может быть существенно шире, чем ограничения, задаваемые связями 1 к n и даже n к m (1-to-many и many-to-many). Поэтому часто ограничения общего вида не выводятся автоматически из концептуальной схемы базы данных, и их приходится добавлять к реляционной схеме вручную. Для того чтобы понять, какие ограничения общего вида должны быть включены в реляционные схемы разделов, приходится возвращаться к документу, содержащему анализ требований корпорации. Задача проектировщика состоит в том, чтобы, с одной стороны, выявить все необходимые ограничения целостности и, с другой стороны, не перегрузить базу данных необязательными ограничениями (любое дополнительное ограничение целостности вызывает дополнительные проверки на стороне сервера при выполнении операций изменения базы данных; проверки для ограничений общего вида могут быть весьма громоздкими). Конечно, если предполагается использование распределенной базы данных, то опять придется учитывать возможности сервера по части ссылок на объекты "чужих" разделов. Это может повлиять на выбор ограничений целостности и/или повлечь создание новой декомпозиции общей базы данных на разделы.



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 138; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.29.209 (0.007 с.)