6.2. Обновление данных

6.2. Обновление данных ФСС

RU

EN

RU EN

UPDATE — изменить строки таблицы

Синтаксис

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

Изменить строки в таблице, используя информацию из других таблиц в базе данных, можно двумя способами: применяя вложенные запросы или указав дополнительные таблицы в предложении FROM. Выбор предпочитаемого варианта зависит от конкретных обстоятельств.

Предложение RETURNING указывает, что команда UPDATE должна вычислить и возвратить значения для каждой фактически изменённой строки. Вычислить в нём можно любое выражение со столбцами целевой таблицы и/или столбцами других таблиц, упомянутых во FROM. При этом в выражении будут использоваться новые (изменённые) значения столбцов таблицы. Список RETURNING имеет тот же синтаксис, что и список результатов SELECT.

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

Параметры

Предложение WITH позволяет задать один или несколько подзапросов, на которые затем можно ссылаться по имени в запросе UPDATE. Подробнее об этом см. Раздел 7.8 и .

Имя таблицы (возможно, дополненное схемой), строки которой будут изменены. Если перед именем таблицы добавлено ONLY, соответствующие строки изменяются только в указанной таблице. Без ONLY строки будут также изменены во всех таблицах, унаследованных от указанной. При желании, после имени таблицы можно указать *, чтобы явно обозначить, что операция затрагивает все дочерние таблицы.

Альтернативное имя целевой таблицы. Когда указывается это имя, оно полностью скрывает фактическое имя таблицы. Например, в запросе UPDATE foo AS f дополнительные компоненты оператора UPDATE должны обращаться к целевой таблице по имени f, а не foo.

Имя столбца в таблице имя_таблицы. Имя столбца при необходимости может быть дополнено именем вложенного поля или индексом массива. Имя таблицы добавлять к имени целевого столбца не нужно — например, запись UPDATE table_name SET table_name.col = 1 ошибочна.

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

Присвоить столбцу значение по умолчанию (это может быть NULL, если для столбца не определено некоторое выражение по умолчанию). Столбец идентификации при этом получает значение, выданное соответствующей последовательностью. Для генерируемого столбца это указание допускается, но не меняет обычное поведение, то есть значение столбца вычисляется генерирующим выражением.

Подзапрос SELECT, выдающий столько выходных столбцов, сколько перечислено в предшествующем ему списке столбцов в скобках. При выполнении этого подзапроса должна быть получена максимум одна строка. Если он выдаёт одну строку, значения столбцов в нём присваиваются целевым столбцам; если же он не возвращает строку, целевым столбцам присваивается NULL. Этот подзапрос может обращаться к предыдущим значениям текущей изменяемой строки в таблице.

Табличное выражение, позволяющее обращаться в условии WHERE и выражениях новых данных к столбцам других таблиц. В нём используется тот же синтаксис, что и в предложении FROM оператора SELECT; например, вы можете определить псевдоним для таблицы. Имя целевой таблицы повторять в предложении FROM нужно, только если вы хотите определить замкнутое соединение (в этом случае для данного имени должен определяться псевдоним).

Выражение, возвращающее значение типа boolean. Изменены будут только те стоки, для которых это выражение возвращает true.

Имя курсора, который будет использоваться в условии WHERE CURRENT OF. С таким условием будет изменена строка, выбранная из этого курсора последней. Курсор должен образовываться запросом, не применяющим группировку, к целевой таблице команды UPDATE. Заметьте, что WHERE CURRENT OF нельзя задать вместе с логическим условием. За дополнительными сведениями об использовании курсоров с WHERE CURRENT OF обратитесь к .

Выражение, которое будет вычисляться и возвращаться командой UPDATE после изменения каждой строки. В этом выражении можно использовать имена любых столбцов таблицы имя_таблицы или таблиц, перечисленных в списке FROM. Чтобы получить все столбцы, достаточно написать *.

Имя, назначаемое возвращаемому столбцу.

Выводимая информация

В случае успешного завершения, UPDATE возвращает метку команды в виде

Здесь число обозначает количество изменённых строк, включая те подлежащие изменению строки, значения в которых не были изменены. Заметьте, что это число может быть меньше количества строк, удовлетворяющих условию, когда изменения отменяются триггером BEFORE UPDATE. Если число равно 0, данный запрос не изменил ни одной строки (это не считается ошибкой).

Если команда UPDATE содержит предложение RETURNING, её результат будет похож на результат оператора SELECT (с теми же столбцами и значениями, что содержатся в списке RETURNING), полученный для строк, изменённых этой командой.

Замечания

Когда присутствует предложение FROM, целевая таблица по сути соединяется с таблицами, перечисленными в элементе_FROM, и каждая выходная строка соединения представляет операцию изменения для целевой таблицы. Применяя предложение FROM, необходимо обеспечить, чтобы соединение выдавало максимум одну выходную строку для каждой строки, которую нужно изменить. Другими словами, целевая строка не должна соединяться с более чем одной строкой из других таблиц. Если это условие нарушается, только одна из строк соединения будет использоваться для изменения целевой строки, но какая именно, предсказать нельзя.

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

В секционированной таблице строка при изменении может перестать удовлетворять ограничению содержащей её секции. При этом если есть другая секция в дереве секционирования, ограничению которой эта строка удовлетворяет, то она переносится в данную секцию. Если такой секции нет, происходит ошибка. За кулисами перемещение строки выполняется посредством операций DELETE и INSERT.

Существует возможность того, что при выполнении другой параллельной операции UPDATE или DELETE с перемещаемой строкой возникнет ошибка сериализации. Например, предположим, что в сеансе 1 выполняется UPDATE для ключа секционирования, а тем временем в параллельном сеансе 2, в котором эта строка видима, выполняется операция UPDATE или DELETE с этой строкой. В этом случае UPDATE/DELETE в сеансе 2 заметит перемещение строки и выдаст ошибку сериализации (которая всегда представляется кодом SQLSTATE ‘40001’). Получив такую ошибку, приложения могут попытаться повторить транзакцию. В обычном случае, когда таблица не секционирована или строка не перемещается, в сеансе 2 видна изменённая строка, и операция UPDATE/DELETE выполняется с новой версией строки.

Читайте также:  Кировское районное отделение ФСС и Кировское, Октябрьское, Ленинского района Омское региональное отделение Фонда социального страхования РФ по улице Пушкина, 67 к 2

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

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

Примеры

Изменение слова Drama на Dramatic в столбце kind таблицы films:

UPDATE films SET kind = ‘Dramatic’ WHERE kind = ‘Drama’;

Изменение значений температуры и сброс уровня осадков к значению по умолчанию в одной строке таблицы weather:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
WHERE city = ‘San Francisco’ AND date = ‘2003-07-03’;

Выполнение той же операции с получением изменённых записей:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
WHERE city = ‘San Francisco’ AND date = ‘2003-07-03’
RETURNING temp_lo, temp_hi, prcp;

Такое же изменение с применением альтернативного синтаксиса со списком столбцов:

UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT)
WHERE city = ‘San Francisco’ AND date = ‘2003-07-03’;

Увеличение счётчика продаж для менеджера, занимающегося компанией Acme Corporation, с применением предложения FROM:

UPDATE employees SET sales_count = sales_count + 1 FROM accounts
WHERE accounts.name = ‘Acme Corporation’
AND employees.id = accounts.sales_person;

Выполнение той же операции, с вложенным запросом в предложении WHERE:

UPDATE employees SET sales_count = sales_count + 1 WHERE id =
(SELECT sales_person FROM accounts WHERE name = ‘Acme Corporation’);

Изменение имени контакта в таблице счетов (это должно быть имя назначенного менеджера по продажам):

UPDATE accounts SET (contact_first_name, contact_last_name) =
(SELECT first_name, last_name FROM employees
WHERE employees.id = accounts.sales_person);

Подобный результат можно получить, применив соединение:

UPDATE accounts SET contact_first_name = first_name,
contact_last_name = last_name
FROM employees WHERE employees.id = accounts.sales_person;

Однако если employees.id — не уникальный ключ, второй запрос может давать непредсказуемые результаты, тогда как первый запрос гарантированно выдаст ошибку, если найдётся несколько записей с одним id. Кроме того, если соответствующая запись accounts.sales_person не найдётся, первый запрос запишет в поля имени NULL, а второй вовсе не изменит строку.

Обновление статистики в сводной таблице в соответствии с текущими данными:

UPDATE summary s SET (sum_x, sum_y, avg_x, avg_y) =
(SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
WHERE d.group_id = s.group_id);

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

Изменение столбца kind таблицы films в строке, на которой в данный момент находится курсор c_films:

UPDATE films SET kind = ‘Dramatic’ WHERE CURRENT OF c_films;

Совместимость

Эта команда соответствует стандарту SQL, за исключением предложений FROM и RETURNING, которые являются расширениями , как и возможность применять WITH с UPDATE.

В некоторых других СУБД также поддерживается дополнительное предложение FROM, но предполагается, что целевая таблица должна ещё раз упоминаться в этом предложении. воспринимает предложение FROM не так, поэтому будьте внимательны, портируя приложения, которые используют это расширение языка.

Согласно стандарту, исходным значением для вложенного списка имён столбцов в скобках может быть любое выражение, выдающее строку с нужным количеством столбцов. принимает в качестве этого значения только конструктор строки или вложенный SELECT. Изменяемое значение отдельного столбца можно обозначать словом DEFAULT в конструкторе строки, но не внутри вложенного SELECT.

The modification of data that is already in the database is referred to as updating. You can update individual rows, all the rows in a table, or a subset of all rows. Each column can be updated separately; the other columns are not affected.

To update existing rows, use the command. This requires three pieces of information:

Recall from Chapter 5 that SQL does not, in general, provide a unique identifier for rows. Therefore it is not always possible to directly specify which row to update. Instead, you specify which conditions a row must meet in order to be updated. Only if you have a primary key in the table (independent of whether you declared it or not) can you reliably address individual rows by choosing a condition that matches the primary key. Graphical database access tools rely on this fact to allow you to update rows individually.

Например, эта команда обновляет все продукты с ценой 5 до цены 10:

ОБНОВЛЕНИЕ продуктов НАБОР цены = 10 ГДЕ цена = 5;

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

ОБНОВЛЕНИЕ продуктов НАБОР цена = цена * 1,10;

Как видите, выражение для нового значения может ссылаться на существующие значения в строке. Мы также исключили предложение WHERE. Если он опущен, это означает, что все строки в таблице обновляются. Если оно присутствует, обновляются только те строки, которые соответствуют условию WHERE. Обратите внимание, что знак равенства в предложении SET является присваиванием, а знак равенства в предложении WHERE — сравнением, но это не создает никакой двусмысленности. Конечно, условие WHERE не обязательно должно быть проверкой равенства. Доступно множество других операторов (см. главу 9). Но выражение должно иметь логический результат.

Вы можете обновить более одного столбца в команде UPDATE, указав более одного назначения в предложении SET. Например:

Краткое описание: в этом руководстве вы узнаете, как использовать синтаксис соединения PostgreSQL UPDATE для обновления данных в таблице на основе значений в другой таблице.

Введение в синтаксис соединения PostgreSQL UPDATE

т1
t1.c1 = новое_значение
т2
t1.c2 = t2.c2;
SQL (язык структурированных запросов)

Чтобы присоединиться к другой таблице в операторе UPDATE , вы указываете объединенную таблицу в предложении FROM и указываете условие соединения в предложении WHERE. Предложение FROM должно располагаться сразу после предложения SET.

Для каждой строки таблицы t1 оператор UPDATE проверяет каждую строку таблицы t2. Если значение в столбце c2 таблицы t1 равно значению в столбце c2 таблицы t2, оператор UPDATE обновляет значение в столбце c1 таблицы t1 новым значением (new_value).

Читайте также:  Электронная гражданская газета

6.2. Обновление данных

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

В таблице Product_segment есть столбец скидки, в котором хранится процент скидки для определенного сегмента. Например, на товары сегмента «большая роскошь» предоставляется скидка 5%, а на товары класса «люкс» и массовые товары — скидки 6% и 10% соответственно.

product_segment (
НАЧАЛЬНЫЙ ,
,
скидка (, )
);

product_segment (, скидка)

(, ),
(, ),
(, );
SQL (язык структурированных запросов)

Во-вторых, создайте еще одну таблицу с именем Product, в которой будут храниться данные о продуктах. Таблица продуктов имеет столбец внешнего ключа «сегмент_ид», который ссылается на идентификатор таблицы сегментов.

продукт(
НАЧАЛЬНЫЙ ,
,
цена (,),
цена нетто (,),
идентификатор_сегмента,
(segment_id) product_segment()
);

продукт (, цена, идентификатор_сегмента)

(, , ),
(, , ),
(, , ),
(‘scelerisque quam turpis’, , ),
(, , ),
(‘ultrices mattis odio’, , ),
(, , ),
(«в доме», , ),
(‘orci eget orci’, , ),
(, , ),
(‘sit amet nunc’, , ),
(, , ),
(, , ),
(, , ),
(, , ),
(‘est quam pharetra’, , ),
(, , ),
(, , ),
(, , ),
(‘нулла элит ак’, , ); SQL (язык структурированных запросов)

продукт
net_price = цена — цена * скидка
продукт_сегмент
Product.segment_id = Product_segment.id; SQL (язык структурированных запросов)

Вы можете использовать псевдонимы таблиц, чтобы сделать запрос короче, например:

ОБНОВЛЕНИЕ
продукт р
НАБОР
net_price = цена — цена * скидка
ОТ
Product_segment с
ГДЕ
p.segment_id = s.id;

net_price = цена — цена * скидка;
SQL (язык структурированных запросов)

*продукт; SQL (язык структурированных запросов)

6.2. Обновление данных

Как видите, столбец net_price обновлен и содержит правильные значения.

В этом руководстве вы узнали, как использовать оператор соединения PostgreSQL UPDATE для обновления данных в таблице на основе значений в другой таблице.

Был ли этот урок полезен?

UPDATE — обновить строки таблицы

Краткое содержание

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

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

Необязательное предложение RETURNING заставляет UPDATE вычислять и возвращать значения на основе каждой фактически обновленной строки. Любое выражение, использующее столбцы таблицы и/или столбцы других таблиц, упомянутых в FROM, может быть вычислено. Используются новые (после обновления) значения столбцов таблицы. Синтаксис списка RETURNING идентичен синтаксису выходного списка SELECT.

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

Параметры

Предложение With позволяет указать один или несколько подзапросов, на которые можно ссылаться по имени в запросе UPDATE. Подробности см. в разделе 7.8.

Имя (необязательно дополненное схемой) таблицы, которую необходимо обновить. Если перед именем таблицы указано ONLY, соответствующие строки обновляются только в именованной таблице. Если ONLY не указано, соответствующие строки также обновляются во всех таблицах, унаследованных от именованной таблицы. При желании после имени таблицы можно указать *, чтобы явно указать, что включены таблицы-потомки.

Замещающее имя целевой таблицы. Если указан псевдоним, он полностью скрывает фактическое имя таблицы. Например, учитывая UPDATE foo AS f, оставшаяся часть оператора UPDATE должна ссылаться на эту таблицу как f, а не foo.

Имя столбца в таблице с именем table_name. При необходимости имя столбца может быть дополнено именем подполя или индексом массива. Не включайте имя таблицы в спецификацию целевого столбца — например, UPDATE table_name SET table_name.col = 1 недействителен.

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

Установите для столбца значение по умолчанию (которое будет NULL, если ему не присвоено определенное выражение по умолчанию). Столбцу идентификаторов будет присвоено новое значение, сгенерированное связанной последовательностью. Для сгенерированного столбца указание этого разрешено, но оно просто определяет нормальное поведение вычисления столбца на основе его выражения генерации.

Подзапрос SELECT, который создает столько выходных столбцов, сколько указано в предшествующем ему списке столбцов в скобках. Подзапрос при выполнении должен возвращать не более одной строки. Если он дает одну строку, значения ее столбца присваиваются целевым столбцам; если он не дает строк, целевым столбцам присваиваются значения NULL. Подзапрос может ссылаться на старые значения текущей строки обновляемой таблицы.

Табличное выражение, позволяющее столбцам из других таблиц появляться в условии WHERE и обновлять выражения. Здесь используется тот же синтаксис, что и в предложении FROM оператора SELECT; например, можно указать псевдоним для имени таблицы. Не повторяйте целевую таблицу как from_item, если только вы не планируете самосоединение (в этом случае она должна появиться с псевдонимом в from_item).

Выражение, возвращающее значение логического типа. Будут обновлены только строки, для которых это выражение возвращает true.

Выражение, которое должно быть вычислено и возвращено командой UPDATE после обновления каждой строки. В выражении можно использовать любые имена столбцов таблицы, имя которой указано в table_name, или таблиц, перечисленных в FROM. Напишите *, чтобы вернуть все столбцы.

Имя, которое будет использоваться для возвращаемого столбца.

Выходы

При успешном завершении команда UPDATE возвращает тег команды вида

Счетчик — это количество обновленных строк, включая совпадающие строки, значения которых не изменились. Обратите внимание, что это число может быть меньше количества строк, соответствующих условию, когда обновления были подавлены триггером BEFORE UPDATE. Если count равен 0, запрос не обновил ни одной строки (это не считается ошибкой).

Если команда UPDATE содержит предложение RETURNING, результат будет аналогичен результату оператора SELECT, содержащего столбцы и значения, определенные в списке RETURNING, вычисленные по строкам, обновленным командой.

Заметки

Когда присутствует предложение FROM, по сути происходит то, что целевая таблица присоединяется к таблицам, упомянутым в списке from_item, и каждая выходная строка соединения представляет собой операцию обновления целевой таблицы. При использовании FROM вы должны убедиться, что соединение создает не более одной выходной строки для каждой изменяемой строки. Другими словами, целевая строка не должна присоединяться более чем к одной строке из другой таблицы (таблиц). Если это так, то для обновления целевой строки будет использоваться только одна из объединяемых строк, но какая из них будет использоваться, предсказать сложно.

Читайте также:  Подтверждение вида деятельности в ФСС через личный кабинет (пошагово)

Из-за этой неопределенности ссылка на другие таблицы только внутри подвыборок безопаснее, хотя часто труднее читать и медленнее, чем использование соединения.

В случае многораздельной таблицы обновление строки может привести к тому, что она больше не будет удовлетворять ограничению раздела, содержащего его. В этом случае, если в дереве разделов есть какой-то другой раздел, для которого эта строка удовлетворяет ограничению раздела, то эта строка перемещается в этот раздел. Если такого раздела нет, произойдет ошибка. На самом деле перемещение строки представляет собой операции DELETE и INSERT.

Существует вероятность того, что одновременное UPDATE или DELETE в перемещаемой строке приведет к ошибке сбоя сериализации. Предположим, сеанс 1 выполняет ОБНОВЛЕНИЕ ключа раздела, а параллельный сеанс 2, для которого эта строка видна, выполняет операцию ОБНОВЛЕНИЕ или УДАЛИТЬ над этой строкой. В таком случае UPDATE или DELETE сеанса 2 обнаружит перемещение строки и выдаст ошибку сбоя сериализации (которая всегда возвращается с кодом SQLSTATE «40001»). В этом случае приложения могут захотеть повторить транзакцию. В обычном случае, когда таблица не секционирована или нет перемещения строк, сеанс 2 идентифицирует недавно обновленную строку и выполняет ОБНОВЛЕНИЕ/УДАЛЕНИЕ для этой новой версии строки.

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

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

Примеры

Измените слово «Драма» на «Драматический» в столбце типа таблицы фильмов:

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

Выполните ту же операцию и верните обновленные записи:

Используйте альтернативный синтаксис списка столбцов, чтобы выполнить то же обновление:

Увеличьте количество продаж продавца, который управляет учетной записью Acme Corporation, используя синтаксис предложения FROM:

Выполните ту же операцию, используя подвыбор в предложении WHERE:

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

Аналогичный результат может быть достигнут с помощью соединения:

Однако второй запрос может дать неожиданные результаты, если сотрудники.id не является уникальным ключом, тогда как первый запрос гарантированно вызовет ошибку, если существует несколько совпадений идентификаторов. Кроме того, если для конкретной записи account.sales_person нет совпадения, первый запрос установит соответствующие поля имени в NULL, тогда как второй запрос вообще не обновит эту строку.

Обновить статистику в сводной таблице в соответствии с текущими данными:

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

НАЧАЛО;
— другие операции
ТОЧКА СОХРАНЕНИЯ sp1;
ВСТАВИТЬ В ЗНАЧЕНИЯ вин(‘Шато Лафит 2003′, ’24’);
— Предположим, что вышеописанное не удалось из-за нарушения уникального ключа,
— Итак, теперь мы выдаем эти команды:
ОТКАТ К sp1;
ОБНОВЛЕНИЕ вин SET stock = stock + 24 WHERE Winename = ‘Chateau Lafite 2003’;
— продолжить другие операции и, в конечном итоге,
СОВЕРШИТЬ;

Измените столбец вида таблицы фильмов в строке, на которой в данный момент находится курсор c_films:

Совместимость

Эта команда соответствует стандарту SQL, за исключением того, что предложения FROM и RETURNING являются расширениями, равно как и возможность использования с UPDATE.

Некоторые другие системы баз данных предлагают опцию FROM, при которой целевая таблица должна быть снова указана в списке FROM. Это не то, как интерпретируется FROM. Будьте осторожны при портировании приложений, использующих это расширение.

Согласно стандарту, исходное значение для подсписка имен целевых столбцов в скобках может быть любым выражением со значением строки, дающим правильное количество столбцов. позволяет исходному значению быть только конструктором строки или подзаголовком SELECT. Обновленное значение отдельного столбца может быть указано как DEFAULT в случае конструктора строк, но не внутри подзаголовка SELECT.

ОБНОВЛЕНИЕ учетных записей SET (имя_контакта, фамилия_контакта) =
(ВЫБЕРИТЕ имя, фамилию ИЗ продавцов
ГДЕ salesmen.id =accounts.sales_id);

ОБНОВЛЕНИЕ учетных записей SET contact_first_name = first_name,
contact_last_name = фамилия_фамилия
ОТ продавцов ГДЕ salesmen.id =accounts.sales_id;

Однако если salesmen.id — не уникальный ключ, второй запрос может давать непредсказуемые результаты, тогда как первый запрос гарантированно выдает ошибку, если найдётся несколько записей с одним идентификатором. Кроме того, если соответствующая запись accounts.sales_id не найдётся, первый запрос запишет в поля имени NULL, а второй вовсе не изменит строку.

Последнее обновление: 25.11.2022

Рассмотрим обновление и удаление данных на примере следующей таблицы

CREATE TABLE people (id SERIAL PRIMARY KEY, name VARCHAR
, age INTEGER)
INSERT INTO people (name, age) VALUES (‘Tom’, 38)
INSERT INTO people (name, age) VALUES (‘Bob’, 42)
INSERT INTO people (name, age) VALUES (‘Sam’, 28)
INSERT INTO people (name, age) VALUES (‘Alice’, 33)
INSERT INTO people (name, age) VALUES (‘Kate’, 25)

Обновление

Для обновления в SQL выполняется команда UPDATE. Например, заменим у всех пользователей имя с Tom на Tomas:

Для выполнения обновления также надо выполнять метод conn.commit()

Для множественного обновления, как и для множественного добавления, применяется метод executemany():

В данном случае на основе списка people будут формироваться две sql-команды:

UPDATE people SET age =15 WHERE name=’Sam’
UPDATE people SET age =18 WHERE name=’Alice’

Удаление данных

Для удаления в SQL выполняется команда DЕLETE. Например, удалим всех пользователей с именем Bob:

Последнее обновление: 23.11.2022

Перевод на карту

Summary: in this tutorial, you will learn how to use the PostgreSQL UPDATE statement to update existing data in a table.

Introduction to the PostgreSQL UPDATE statement

In this syntax:

The WHERE clause is optional. If you omit the WHERE clause, the UPDATE statement will update all rows in the table.

The count is the number of rows updated including rows whose values did not change.

Returning updated rows

The UPDATE statement has an optional RETURNING clause that returns the updated rows:

PostgreSQL UPDATE examples

Let’s take some examples of using the PostgreSQL UPDATE statement.

Setting up a sample table

* courses; SQL (Structured Query Language)


6.2. Обновление данных

1) PostgreSQL UPDATE – updating one row

*
courses
course_id = ; SQL (Structured Query Language)

Оцените статью
ФСС Help
Добавить комментарий