Хелпикс

Главная

Контакты

Случайная статья





Изменение данных



Для изменения значений столбцов таблицы применяется оператор UPDATE (изменить, обновить). Чтобы изменить значения в одном столбце таблицы в тех записях, которые удовлетворяют некоторому условию, следует выполнить такой запрос:

 

UPDATE имяТаблицы SET имяСтолбца = значение WHERE условие;

 

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

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

 

UPDATE имя Таблицы

SET имяСтолбца1 = значение1, имяСтолбца2 = значение2, имяСтолбцаИ = значениеИ

WHERE условие;

Например, следующий запрос изменяет значения столбцов Телефон и Сумма_заказа в таблице Клиенты для тех записей, в которых столбец Имя имеет значение 'иванов '.

 

UPDATE Клиенты

SET Телефон = '333-1234, Сумма заказа = 2570

WHERE Имя = 'Иванов';

 

Использование оператора WHERE в операторе UPDATE не обязательно. Если он отсутствует, то указанные в SET изменения будут произведены для всех записей таблицы.

Операция изменения записей, как и их удаление, связана с риском необратимых потерь данных в случае семантических ошибок при формулировке SQL-выражения. Например, стоит только забыть написать оператор WHERE, и будут обновлены значения во всех записях таблицы. Чтобы избежать подобных неприятностей, перед обновлением записей рекомендуется выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут изменены. Например, перед выполнением приведенного ранее запроса на обновление данных не помешает выполнить соответствующий запрос на выборку данных:

 

SELECT * FROM Клиенты

WHERE Имя = 'Иванов';

 

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

Условие в операторе WHERE может содержать подзапросы, в том числе и связанные. Пусть в базе данных имеется таблица продажи (ID_товара, Сумма_заказа, ID_клиента), содержащая сведения о продажах товаров клиентам. Предположим, что требуется сделать 5% скидку тем клиентам, которые приобрели товары на сумму, большую 1000. Для этого следует изменить значения столбца Сумма_заказа, просто умножить их на 0, 95. Однако эти изменения должны бьпь выполнены, только если сумма значений этого поля для данного клиента превышает 1000. Таким образом, запрос на изменение данных должен содержать связанный подзапрос:

 

UPDATE Продажи T1

SET Сумма_заказа = Сумма_заказа*0. 95

WHERE 1000 <

(SELECT SUM(T2. Сумма_заказа) FROM Продажи Т2

WHERE TI. ID_клиента = T2. ID_клиента);

 

Здесь запрос на изменение данных из таблицы продажи содержит связанный (коррелированный) подзапрос, вычисляющий сумму значений столбца Сумма_заказа. Обратите внимание на использование двух различных псевдонимов для одной и той же таблицы. При выполнении данного запроса происходит последовательный просмотр записей в таблице продажи. Для каждой записи проверяется условие оператора WHERE, а именно выполняется подзапрос, вычисляющий сумму значений столбца Сумма заказа для всех записей, в которых идентификатор клиента равен текущему значению этого идентификатора. Если вычисленное значение превышает 1000, то условие оператора WHЕВЕ выполняется и происходит изменение данных в соответствии с выражением SET, в противном = случае изменения не вносятся. Далее происходит переход к следующей записи, рассматриваемой в качестве текущей, и описанные действия повторяются снова.

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

Допустим, имеется таблица Клиенты(имя, Адрес, Регион, Телефон). Требуется изменить значения столбца Регион следующим образом: если значение столбца равно 'северо-Запад', то его, следует заменить на 'санкт-петербург', если значение равно 'тверская область ', то его следует заменить на 'тверь ', во всех =. остальных случаях нужно оставить прежние значения. Эту задачу можно решить с помощью такого запроса:

UPDATE Клиенты

SET Регион = CASE

WHEN Регион = 'Северо-Запад' THEN 'Санкт-Петербург'
WHEN Регион = 'Тверская область' THEN 'Тверь'
ELSE Регион

END;

 

Без оператора CASE данную задачу пришлось бы решать с помощью двух последовательных запросов:

 

UPDATE Клиенты

SET Регион = 'Санкт-Петербург' WHERE Регион = 'Северо-Запад';

UPDATE Клиенты

SET Регион 'Тверь' WHERE Регион = 'Тверская область';

 

Допустим, что в таблице клиенты было решено изменить значение 'иркутск' столбца Регион. Однако новое значение пока неопределено и поэтому вместо 'иркутск' решили внести значение NULL. Так обычно поступают, чтобы обозначить тот факт, что значение не известно или еще не введено. В данном случае удобно применить запрос с использованием функции NULLIF():

 

UPDATE Клиенты

SET. Регион = NULLIF(Регион, 'Иркутск');

 

При изменении значений в столбцах таблицы необходимо следить, чтобы типы значений соответствовали типам столбцов. При необходимости можно воспользоваться функцией преобразования типов CAST().

Некоторые базы данных (например, PostgreSQL) имеют расширение стандарта SQL, позволяющее обновлять одну таблицу данными из другой. Так, например, чтобы обновить таблицу Клиенты Данными из таблицы продажи, можно использовать такое выражение:

 

UPDATE Клиенты SET Сумма_заказа = Продажи. Сумма_заказа

FROM Продали

WHERE ID_клиента=5;

 

Проверка ссылочной целостности

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

 

Целостность данных может быть нарушена при попытке добавить запись в дочернюю таблицу, для которой нет соответствующей записи в родительской таблице. Например, в базе данных имеется родительская таблица клиенты(имя_клиента, имя, Адрес, Телефон) и дочерняя таблица продажи (ID_заказа, Товар, Цена, Количество, Имя_клиента). В таблице Клиенты столбец

Имя_клиента является первичным ключом (имеет уникальные и определенные значения), а в таблице продажи столбец имя_клиента не обязан иметь уникальные значения, поскольку один и тот же клиент может сделать несколько различных покупок. Чтобы эти две таблицы находились в связи, столбец имя_клиента в таблице продаж должен быть внешним ключом, ссылающимся на первичный ключ имя_клиента в таблице клиенты. 0 внешних ключах более подробно будет рассказано  далее.

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

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

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

Предикат MATCH имеет следующий синтаксис:

ЗначениеТипаЗаписи ROW MATCH [UNIQUE] [SIMPLE | PARTIAL | FULL] (подзапрос);

Здесь в квадратных скобках указаны необязательные ключевые слова, а вертикальной чертой разделены их альтернативные варианты: UNIQUE (уникальный), SIMPLE (простой), PARTIAL. (частичный), FULL (полный). Эти ключевые слова определяют правила обработки значений типа записи с полями, имеющими неопределенные значения.

Допустим, требуется определить, есть ли в таблице продажи запись ('иванов', 'компьютер'). Для этого можно выполнить такой запрос к базе данных:

 

SELECT * FROM Продажи

WHERE ('Иванов', 'Компьютер')

MATCH (SELECT Имя_клиента, Товар FROM Продажи);

 

Если в таблице продажи есть запись с указанным именем клиента и товаром, то предикат MATCH вернет значение true.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.