Оператор UPDATE в стандарте SQL-92 имеет следующее формальное описание:
UPDATE table_name SET { field = { expr | NULL | DEFAULT }} .,… [ { WHERE condition } | { WHERE CURRENT OF cursor_name } ];
Оператор UPDATE применяется для внесения изменений в данные таблиц.
Выражение (expr), используемое для вычисления значения столбца, может быть как простым выражением, так и подзапросом, возвращающим единственное значение. В выражении можно ссылаться на старое значение изменяемого столбца и других столбцов текущей записи.
При вычислении значений столбцов можно применять условное выражение CASE и выражение CAST для приведения типов.
Например:
SELECT f1, CAST (f2 AS CHAR), CAST (f3 AS CHAR) from tbl1; UPDATE tbl2 SET f2 = (SELECT CAST (f2 AS CHAR) from tbl1 WHERE f1=1); UPDATE tbl2 SET f5 = (SELECT CAST (f5 AS DATE) from tbl1 WHERE f1=1), f6= CAST ('10/12/2003' AS DATE);
Условное выражение CASE позволяет выбрать одно из нескольких значений на основании указываемого условия.
Условное выражение CASE имеет следующее формальное описание:
{ CASE { expr WHEN expr THEN { expr | NULL }} … | { WHEN expr THEN { expr | NULL }} … [ ELSE { expr | NULL } ] END} | { NULLIF {expr1,expr2) } | {COALESCE (expr .,…) }
Условное выражение CASE может быть записано, соответственно, в четырех формах:
CASE с выражениями. Например:
SELECT f1, CASE f3 'abc' THEN '1_abc' END FROM tbl1;
CASE с предикатами. Например:
SELECT f1, CASE WHEN f3= 'abc' THEN '1_abc' ELSE f3 END FROM tbl1;
NULLIF - если выражения, указанные в скобках не совпадают, то выбирается первое из этих значений, в противном случае устанавливается значение NULL. Например:
UPDATE tbl2 SET f3 = (SELECT NULLIF (f3,'aaa') FROM tbl1 WHERE f1=1);
COALESCE - выбирается первое значение в списке, не равное NULL. Например:
INSERT INTO tbl1(f1,f2) VALUES (1+ COALESCE(SELECT MAX(f1) FROM tbl1, 0 ), 100);
Для успешного выполнения оператора UPDATE требуется ряд условий, включая следующие:
наличие соответствующих привилегий;
для представления требуется определение его как изменяемого;
при изменении представлений применяются ограничения WITH CHECK OPTION или WITH CASCADED CHECK OPTION, установленные при создании этого представления;
в транзакциях "только чтение" изменение доступно только для временных таблиц;
выражения, используемые для определения значений, не могут содержать подзапросы с агрегирующими функциями;
для обновляемого курсора, указанного фразой FOR UPDATE, каждый изменяемый столбец также должен быть определен как FOR UPDATE;
в курсоре с фразой ORDER BY нельзя выполнять изменение столбцов, указанных в этой фразе.