Oracle изменить значение поля
Обновлено: 04.07.2024
Оператор UPDATE изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис:
С помощью одного оператора могут быть заданы значения для любого количества столбцов. Однако в одном и том же операторе UPDATE можно вносить изменения в каждый столбец указанной таблицы только один раз. При отсутствии предложения WHERE будут обновлены все строки таблицы.
Если столбец допускает NULL -значение, то его можно указать в явном виде. Кроме того, можно заменить имеющееся значение на значение по умолчанию (DEFAULT) для данного столбца.
Ссылка на «выражение для вычисления значения столбца» может относиться к текущим значениям в изменяемой таблице. Например, мы можем уменьшить все цены портативных компьютеров на 10 процентов с помощью следующего оператора:
Разрешается также значения одних столбцов присваивать другим столбцам. Пусть, например, требуется заменить жесткие диски менее 10 Гбайт в портативных компьютерах. При этом емкость новых дисков должна составлять половину объема RAM, имеющейся в данных устройствах. Эту задачу можно решить следующим образом:
Естественно, типы данных столбцов hd и ram должны быть совместимы. Для приведения типов может использоваться выражение CAST (пункт 5.9).
Если требуется изменять данные в зависимости от содержимого некоторого столбца, можно воспользоваться выражением CASE (пункт 5.9) Если, скажем, нужно поставить жесткие диски объемом 20 Гбайт на портативные компьютеры с памятью менее 128 Мбайт и 40 гигабайтные — на остальные портативные компьютеры, то можно написать такой запрос:
Для вычисления значений столбцов допускается также использование подзапросов. Например, требуется укомплектовать все портативные компьютеры самыми быстрыми процессорами из имеющихся в наличии. Тогда можно написать:
Необходимо сказать несколько слов об автоинкрементируемых столбцах. Если столбец code в таблице Laptop определен как IDENTITY(1,1), то следующий оператор
Разумеется, другой строки со значением code = 5 в таблице быть не должно.
Команда UPDATE редактирует записи в базе данных.
Какие записи для редактирования задаются с помощью команды WHERE.
Команда WHERE не является обязательной, если ее не указать - будут обновлены все записи в таблице. Будьте внимательны - так случайно можно уничтожить все данные.
См. также команды SELECT, INSERT, DELETE, которые отвечают за получение, вставку и удаление записей.
Синтаксис
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику с id, равным 1 (то есть Диме), устанавливается возраст 30 и зарплата 1000:
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 30 | 1000 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику с id, равным 1 (то есть Диме), устанавливается возраст 30:
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 30 | 400 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику Пете устанавливается новое имя Коля:
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Коля | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере всем работникам устанавливается зарплата 1000 (так как не задано WHERE - наш запрос обновит все записи):
В oracle SQL, как мне выполнить запрос sql update, который может обновлять таблицу 1 с именем таблицы и desc с использованием того же идентификатора? Таким образом, конечный результат, который я получил бы, -
Вопрос берется из обновлять одну таблицу данными из другого, но специально для Oracle.
ОТВЕТЫ
Ответ 1
Это называется коррелированным обновлением
Предполагая, что результат соединения будет сохранен в виде ключа, вы также можете
Ответ 2
Ответ 3
Ответ 4
Кажется, еще лучший ответ с предложением "in", который позволяет нескольким клавишам для соединения:
У говядины есть столбцы, которые вы хотите использовать в качестве ключа в круглых скобках в предложении where перед "in", и в скобках указывается оператор выбора с теми же именами столбцов. где (column1, column2) в (выберите ( column1, column2) из таблицы, где "набор, который я хочу" );
Ответ 5
никогда не работал у меня, так как set only ожидает 1 значение - Ошибка SQL: ORA-01427: однострочный подзапрос возвращает более одной строки.
То, как именно вы запускаете его на рабочем листе SQLDeveloper. Они говорят это медленно, но это единственное решение, которое работало для меня в этом случае.
Ответ 6
Если ваша таблица t1 и резервная копия t2 имеют много столбцов, здесь это компактный способ сделать это.
Кроме того, моя связанная с этим проблема заключалась в том, что только некоторые из столбцов были изменены, и многие строки не имели редактирования для этих столбцов, поэтому я хотел оставить их в покое - в основном восстановить подмножество столбцов из резервной копии всей таблицы. Если вы хотите просто восстановить все строки, пропустите предложение where.
Конечно, проще было бы удалить и вставить как выбрать, но в моем случае мне понадобилось решение с просто обновлениями.
Фокус в том, что когда вы выбираете * из пары таблиц с именами дубликатов столбцов, второй получает имя _1. Итак, вот что я придумал:
где plsql_trigger_source, это такая конструкция:
Конструкции simple_dml_trigger, instead_of_dml_trigger, compound_dml_trigger и system_trigger будут приведены в соответствующих разделах статьи.
- DML триггеры создаются для таблиц или представлений, срабатывают при вставке, обновлении или удалении записей.
- Триггер может быть создан в другой схеме, отличной от той, где определена таблицы. В таком случае текущей схемой при выполнении триггера считается схема самого триггера.
- При операции MERGE срабатывают триггеры на изменение, вставку или удаление записей в зависимости от операции со строкой.
- Триггер – часть транзакции, ошибка в триггере откатывает операцию, изменения таблиц в триггере становятся частью транзакции.
- Если откатывается транзакция, изменения триггера тоже откатываются.
- В триггерах запрещены операторы DDL и управления транзакциями (исключения – автономные транзакции).
Конструкция simple_dml_trigger:
Где, dml_event_clause:
referencing_clause:
trigger_edition_clause:
trigger_body:
- На таблице
- На представлении (instead of trigger)
- Вставка записей (insert)
- Обновление записей (update)
- Удаление записей (delete)
- Уровень всей команды (statement level triggers)
- Уровень записи (row level triggers)
- Составные триггеры (compound triggers)
- Перед выполнением операции (before)
- После выполнения операции (after)
Crossedition triggers — служат для межредакционного взаимодействия, например для переноса и трансформации данных из полей, отсутствующих в новой редакции, в другие поля.
Условные предикаты для определения операции, на которую сработал триггер:
Предикат | Описание |
---|---|
Inserting | True, если триггер сработал на операцию Insert |
Updating | True, если триггер сработал на операцию Update |
Updating(‘colum’) | True, если триггер сработал на операцию Update, которая затрагивает определенное поле |
Deleting | True, если триггер сработал на операцию Delete |
Эти предикаты могут использоваться везде, где можно использовать Boolean выражения.
Псевдозаписи
Существуют псевдозаписи, позволяющие обратиться к полям изменяемой записи и получить значения полей до изменения и значения полей после изменения. Это записи old и new. С помощью конструкции Referencing можно изменить их имена. Структура этих записей tablename%rowtype. Эти записи есть только у триггеров row level или у compound триггеров (с секциями уровня записи).
Операция срабатывания триггера | OLD.column | NEW.column |
---|---|---|
Insert | Null | Новое значение |
Update | Старое значение | Новое значение |
Delete | Старое значение | Null |
- С псевдозаписями запрещены операции уровня всей записи ( :new = null;)
- Нельзя изменять значения полей записи old
- Если триггер срабатывает на delete, нельзя изменить значения полей записи new
- В триггере after нельзя изменить значения полей записи new
Instead of dml triggers
- Создаются для представлений (view) и служат для замещения DML операций своим функционалом.
- Позволяют производить операции вставки/обновления или удаления для необновляемых представлений.
Конструкция instead_of_dml_trigger:
- Это всегда триггер уровня записи (row level)
- Имеет доступ к псевдозаписям old и new, но не может изменять их
- Заменяет собой dml операцию с представлением (view)
Instead of triggers on Nested Table Columns of Views
Можно создать триггер для вложенной в представлении таблицы. В таком триггере также присутствует дополнительная псевдозапись – parent, которая ссылается на всю запись представления (стандартные псевдозаписи old и new ссылаются только на записи вложенной таблицы)
Составные DML триггера (compound DML triggers)
Появившиеся в версии 11G эти триггера включают в одном блоке обработку всех видов DML триггеров.
Конструкция compound_dml_trigger:
Где, compound_trigger_block:
timing_point_section:
timing_point:
tps_body:
- Срабатывают такие триггера при разных событиях и в разные моменты времени (на уровне оператора или строки, при вставке/обновлении/удалении, до или после события).
- Не могут быть автономными транзакциями.
- Собирать в коллекцию строки для вставки в другую таблицу, чтобы периодически вставлять их пачкой
- Избежать ошибки мутирующей таблицы (mutating-table error)
Структура составного триггера
- Before statement
- After statement
- Before each row
- After each row
- Нельзя обращаться к псевдозаписям old, new или parent в секциях уровня выражения (before statement и after statement)
- Изменять значения полей псевдозаписи new можно только в секции before each row
- Исключения, сгенерированные в одной секции, нельзя обрабатывать в другой секции
- Если используется оператор goto, он должен указывать на код в той же секции
Основные правила определения DML триггеров
- Update of – позволяет указать список изменяемых полей для запуска триггера
- Все условия в заголовке и When … проверяются без запуска триггера на стадии выполнения SQL
- В операторе When можно использовать только встроенные функции
- Можно делать несколько триггеров одного вида, порядок выполнения не определен по умолчанию, но его можно задать с помощью конструкции FOLLOWS TRIGGER_FIRST
- Ограничения уникальности проверяются при изменении записи, то есть после выполнения триггеров before
- Секция объявления переменных определяется словом DECLARE
- Основной блок триггера подчиняется тем же правилам, что и обычные PL/SQL блоки
Ограничения DML триггеров
- нельзя выполнять DDL statements (только в автономной транзакции)
- нельзя запускать подпрограммы с операторами контроля транзакций
- не имеет доступа к SERIALLY_REUSABLE пакетов
- размер не может превышать 32К
- нельзя декларировать переменные типа LONG и LONG RAW
Ошибка мутирования таблицы ORA-04091
- использовать триггеры уровня операции
- автономная транзакция в триггере
- использовать сторонние структуры (коллекции уровня пакета)
- использовать COMPOUND TRIGGER
- изменение самого алгоритма с выносом функционала из триггера
Конструкция system_trigger:
Такие триггеры относятся или к схеме, или ко всей базе данных.
Читайте также: