Шаг 48 - PL/SQL - DML, оператор UPDATE

Что ж! Осталась одна операция с таблицами БД, которую мы с вами еще не рассматривали. Конечно же, изменение данных. Данные в таблицах БД изменяются с помощью оператора DML - UPDATE. Синтаксис этого оператора таков:

------------------------- UPDATE ----------- таблица --------- SET ----------------------------
-------------------------------------- имя столбца -- = -- выражение --------------------------
------------------------- WHERE ------ условие ------------------------------------------------

Синтаксически все довольно просто, как видим, в операторе UPDATE так же присутствует предложение WHERE, а следовательно, применимы все правила получения результирующего набора. Давайте посмотрим на практике, что можно сделать с таблицей с помощью оператора DML - UPDATE. Например, введите примерно следующее:

UPDATE PEOPLE
	SET NM = 'IVAN'
/

COMMIT
/

Получаем:

SQL> UPDATE PEOPLE
  2   SET NM = 'IVAN'
  3  /

2 строк обновлено.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

А, вот теперь давайте уже не вслепую как в прошлый раз, а уже на деле посмотрим, что же произошло с таблицей:

SELECT * FROM PEOPLE
/

Вывод:

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM          OT
---- ------ ----------- ---------------
   2 IVAN   NULL       Martovich
   3 IVAN   Black       NULL

Ух ты! Неожиданный ход, не так ли? Вроде бы мы ввели одно значение в операторе. А изменились все записи, хоть их всего то и две! Да, именно так и должно быть. Ведь мы не указали UPDATE в условии какие записи менять, а какие нет! Вот и получите результат, он прошелся по всей таблице от первой до последней записи и изменил их значение на IVAN! Теперь давайте исправим ситуацию и применим трюк с NULL в предложении WHERE! Вот так:

UPDATE PEOPLE
	SET FM = 'Jason'		
WHERE FM IS NULL
/

COMMIT
/

SELECT * FROM PEOPLE
/

Получаем следующее:

SQL> UPDATE PEOPLE
  2   SET FM = 'Jason'
  3  WHERE FM IS NULL
  4  /

1 строка обновлена.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM          OT
---- ------ ----------- ---------------
   2 IVAN   Jason       Martovich
   3 IVAN   Black       NULL

Изменилась тоько одна запись, а теперь давайте вернем Jason-у его старое имя:

UPDATE PEOPLE
	SET NM = 'Bob'		
WHERE FM = 'Jason'		
/

COMMIT
/

SELECT * FROM PEOPLE
/

Смотрим, что получилось:

SQL> UPDATE PEOPLE
  2   SET NM = 'Bob'
  3  WHERE FM = 'Jason'
  4  /

1 строка обновлена.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM          OT
---- ------ ----------- ---------------
   2 Bob    Jason       Martovich
   3 IVAN   Black       NULL

Вот теперь Bob Jason стал похож на человека! Всего-то мы применили предложение WHERE! Теперь давайте добавим запись с NULL значениями, то есть пустую:

INSERT INTO PEOPLE(ID, NM, FM, OT)
			VALUES(5, NULL, NULL, NULL)
/

COMMIT
/

SELECT * FROM PEOPLE
/

Вывод:

SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
  2     VALUES(5, NULL, NULL, NULL)
  3  /

1 строка создана.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM         OT
---- ------ ---------- ---------------
   5 NULL   NULL       NULL
   2 Bob    Jason      Martovich
   3 IVAN   Black      NULL

Есть пустая запись. А вот теперь давайте изменим ее по всем правилам с применением значения ключевого (уникального) поля ID таблицы PEOPLE:

UPDATE PEOPLE
	SET NM = 'Irvin',
		FM = 'Show',
		OT = 'Brefovich' 
WHERE ID = 5
/

COMMIT
/

SELECT * FROM PEOPLE
/

Получаем результат работы:

SQL> UPDATE PEOPLE
  2   SET NM = 'Irvin',
  3    FM = 'Show',
  4    OT = 'Brefovich'
  5  WHERE ID = 5
  6  /

1 строка обновлена.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM         OT
---- ------ ---------- ---------------
   5 Irvin  Show       Brefovich 
   2 Bob    Jason      Martovich
   3 IVAN   Black      NULL

Вот смотрите внимательно, так работает внутренняя структура почти всех клиентских приложений, берется значение ключевого поля и изменяется именно эта конкретная запись! Теперь давайте изменим значение самого ключа поля применив математическое выражение в части SET оператора UPDATE:

UPDATE PEOPLE
	SET ID = 5+2
WHERE ID = 5
/

COMMIT
/

SELECT * FROM PEOPLE
/

Получаем:

SQL> UPDATE PEOPLE
  2   SET ID = 5+2
  3  WHERE ID = 5
  4  /

1 строка обновлена.

SQL> COMMIT
  2  /

Фиксация обновлений завершена.

SQL> SELECT * FROM PEOPLE
  2  /

  ID NM     FM         OT
---- ------ ---------- ---------------
   7 Irvin  Show       Brefovich 
   2 Bob    Jason      Martovich
   3 IVAN   Black      NULL

Теперь, как мы видим, значение ключевого поля изменилось с 5 на 7. А, остальное не изменялось. Главное, чтобы это значение не совпало ни с одним из уже существующих в таблице PEOPLE! Вот собственно так работает оператор UPDATE. В итоге мы с вами рассмотрели три основных рабочих лошадки, обработки и изменения таблиц БД! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 21.10.2003