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:

Такие триггеры относятся или к схеме, или ко всей базе данных.

Читайте также: