1UPDATE(7) PostgreSQL 16.1 Documentation UPDATE(7)
2
3
4
6 UPDATE - update rows of a table
7
9 [ WITH [ RECURSIVE ] with_query [, ...] ]
10 UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
11 SET { column_name = { expression | DEFAULT } |
12 ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
13 ( column_name [, ...] ) = ( sub-SELECT )
14 } [, ...]
15 [ FROM from_item [, ...] ]
16 [ WHERE condition | WHERE CURRENT OF cursor_name ]
17 [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
18
20 UPDATE changes the values of the specified columns in all rows that
21 satisfy the condition. Only the columns to be modified need be
22 mentioned in the SET clause; columns not explicitly modified retain
23 their previous values.
24
25 There are two ways to modify a table using information contained in
26 other tables in the database: using sub-selects, or specifying
27 additional tables in the FROM clause. Which technique is more
28 appropriate depends on the specific circumstances.
29
30 The optional RETURNING clause causes UPDATE to compute and return
31 value(s) based on each row actually updated. Any expression using the
32 table's columns, and/or columns of other tables mentioned in FROM, can
33 be computed. The new (post-update) values of the table's columns are
34 used. The syntax of the RETURNING list is identical to that of the
35 output list of SELECT.
36
37 You must have the UPDATE privilege on the table, or at least on the
38 column(s) that are listed to be updated. You must also have the SELECT
39 privilege on any column whose values are read in the expressions or
40 condition.
41
43 with_query
44 The WITH clause allows you to specify one or more subqueries that
45 can be referenced by name in the UPDATE query. See Section 7.8 and
46 SELECT(7) for details.
47
48 table_name
49 The name (optionally schema-qualified) of the table to update. If
50 ONLY is specified before the table name, matching rows are updated
51 in the named table only. If ONLY is not specified, matching rows
52 are also updated in any tables inheriting from the named table.
53 Optionally, * can be specified after the table name to explicitly
54 indicate that descendant tables are included.
55
56 alias
57 A substitute name for the target table. When an alias is provided,
58 it completely hides the actual name of the table. For example,
59 given UPDATE foo AS f, the remainder of the UPDATE statement must
60 refer to this table as f not foo.
61
62 column_name
63 The name of a column in the table named by table_name. The column
64 name can be qualified with a subfield name or array subscript, if
65 needed. Do not include the table's name in the specification of a
66 target column — for example, UPDATE table_name SET table_name.col =
67 1 is invalid.
68
69 expression
70 An expression to assign to the column. The expression can use the
71 old values of this and other columns in the table.
72
73 DEFAULT
74 Set the column to its default value (which will be NULL if no
75 specific default expression has been assigned to it). An identity
76 column will be set to a new value generated by the associated
77 sequence. For a generated column, specifying this is permitted but
78 merely specifies the normal behavior of computing the column from
79 its generation expression.
80
81 sub-SELECT
82 A SELECT sub-query that produces as many output columns as are
83 listed in the parenthesized column list preceding it. The sub-query
84 must yield no more than one row when executed. If it yields one
85 row, its column values are assigned to the target columns; if it
86 yields no rows, NULL values are assigned to the target columns. The
87 sub-query can refer to old values of the current row of the table
88 being updated.
89
90 from_item
91 A table expression allowing columns from other tables to appear in
92 the WHERE condition and update expressions. This uses the same
93 syntax as the FROM clause of a SELECT statement; for example, an
94 alias for the table name can be specified. Do not repeat the target
95 table as a from_item unless you intend a self-join (in which case
96 it must appear with an alias in the from_item).
97
98 condition
99 An expression that returns a value of type boolean. Only rows for
100 which this expression returns true will be updated.
101
102 cursor_name
103 The name of the cursor to use in a WHERE CURRENT OF condition. The
104 row to be updated is the one most recently fetched from this
105 cursor. The cursor must be a non-grouping query on the UPDATE's
106 target table. Note that WHERE CURRENT OF cannot be specified
107 together with a Boolean condition. See DECLARE(7) for more
108 information about using cursors with WHERE CURRENT OF.
109
110 output_expression
111 An expression to be computed and returned by the UPDATE command
112 after each row is updated. The expression can use any column names
113 of the table named by table_name or table(s) listed in FROM. Write
114 * to return all columns.
115
116 output_name
117 A name to use for a returned column.
118
120 On successful completion, an UPDATE command returns a command tag of
121 the form
122
123 UPDATE count
124
125 The count is the number of rows updated, including matched rows whose
126 values did not change. Note that the number may be less than the number
127 of rows that matched the condition when updates were suppressed by a
128 BEFORE UPDATE trigger. If count is 0, no rows were updated by the query
129 (this is not considered an error).
130
131 If the UPDATE command contains a RETURNING clause, the result will be
132 similar to that of a SELECT statement containing the columns and values
133 defined in the RETURNING list, computed over the row(s) updated by the
134 command.
135
137 When a FROM clause is present, what essentially happens is that the
138 target table is joined to the tables mentioned in the from_item list,
139 and each output row of the join represents an update operation for the
140 target table. When using FROM you should ensure that the join produces
141 at most one output row for each row to be modified. In other words, a
142 target row shouldn't join to more than one row from the other table(s).
143 If it does, then only one of the join rows will be used to update the
144 target row, but which one will be used is not readily predictable.
145
146 Because of this indeterminacy, referencing other tables only within
147 sub-selects is safer, though often harder to read and slower than using
148 a join.
149
150 In the case of a partitioned table, updating a row might cause it to no
151 longer satisfy the partition constraint of the containing partition. In
152 that case, if there is some other partition in the partition tree for
153 which this row satisfies its partition constraint, then the row is
154 moved to that partition. If there is no such partition, an error will
155 occur. Behind the scenes, the row movement is actually a DELETE and
156 INSERT operation.
157
158 There is a possibility that a concurrent UPDATE or DELETE on the row
159 being moved will get a serialization failure error. Suppose session 1
160 is performing an UPDATE on a partition key, and meanwhile a concurrent
161 session 2 for which this row is visible performs an UPDATE or DELETE
162 operation on this row. In such case, session 2's UPDATE or DELETE will
163 detect the row movement and raise a serialization failure error (which
164 always returns with an SQLSTATE code '40001'). Applications may wish to
165 retry the transaction if this occurs. In the usual case where the table
166 is not partitioned, or where there is no row movement, session 2 would
167 have identified the newly updated row and carried out the UPDATE/DELETE
168 on this new row version.
169
170 Note that while rows can be moved from local partitions to a
171 foreign-table partition (provided the foreign data wrapper supports
172 tuple routing), they cannot be moved from a foreign-table partition to
173 another partition.
174
175 An attempt of moving a row from one partition to another will fail if a
176 foreign key is found to directly reference an ancestor of the source
177 partition that is not the same as the ancestor that's mentioned in the
178 UPDATE query.
179
181 Change the word Drama to Dramatic in the column kind of the table
182 films:
183
184 UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
185
186 Adjust temperature entries and reset precipitation to its default value
187 in one row of the table weather:
188
189 UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
190 WHERE city = 'San Francisco' AND date = '2003-07-03';
191
192 Perform the same operation and return the updated entries:
193
194 UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
195 WHERE city = 'San Francisco' AND date = '2003-07-03'
196 RETURNING temp_lo, temp_hi, prcp;
197
198 Use the alternative column-list syntax to do the same update:
199
200 UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT)
201 WHERE city = 'San Francisco' AND date = '2003-07-03';
202
203 Increment the sales count of the salesperson who manages the account
204 for Acme Corporation, using the FROM clause syntax:
205
206 UPDATE employees SET sales_count = sales_count + 1 FROM accounts
207 WHERE accounts.name = 'Acme Corporation'
208 AND employees.id = accounts.sales_person;
209
210 Perform the same operation, using a sub-select in the WHERE clause:
211
212 UPDATE employees SET sales_count = sales_count + 1 WHERE id =
213 (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');
214
215 Update contact names in an accounts table to match the currently
216 assigned salespeople:
217
218 UPDATE accounts SET (contact_first_name, contact_last_name) =
219 (SELECT first_name, last_name FROM employees
220 WHERE employees.id = accounts.sales_person);
221
222 A similar result could be accomplished with a join:
223
224 UPDATE accounts SET contact_first_name = first_name,
225 contact_last_name = last_name
226 FROM employees WHERE employees.id = accounts.sales_person;
227
228 However, the second query may give unexpected results if employees.id
229 is not a unique key, whereas the first query is guaranteed to raise an
230 error if there are multiple id matches. Also, if there is no match for
231 a particular accounts.sales_person entry, the first query will set the
232 corresponding name fields to NULL, whereas the second query will not
233 update that row at all.
234
235 Update statistics in a summary table to match the current data:
236
237 UPDATE summary s SET (sum_x, sum_y, avg_x, avg_y) =
238 (SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
239 WHERE d.group_id = s.group_id);
240
241 Attempt to insert a new stock item along with the quantity of stock. If
242 the item already exists, instead update the stock count of the existing
243 item. To do this without failing the entire transaction, use
244 savepoints:
245
246 BEGIN;
247 -- other operations
248 SAVEPOINT sp1;
249 INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
250 -- Assume the above fails because of a unique key violation,
251 -- so now we issue these commands:
252 ROLLBACK TO sp1;
253 UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
254 -- continue with other operations, and eventually
255 COMMIT;
256
257 Change the kind column of the table films in the row on which the
258 cursor c_films is currently positioned:
259
260 UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
261
263 This command conforms to the SQL standard, except that the FROM and
264 RETURNING clauses are PostgreSQL extensions, as is the ability to use
265 WITH with UPDATE.
266
267 Some other database systems offer a FROM option in which the target
268 table is supposed to be listed again within FROM. That is not how
269 PostgreSQL interprets FROM. Be careful when porting applications that
270 use this extension.
271
272 According to the standard, the source value for a parenthesized
273 sub-list of target column names can be any row-valued expression
274 yielding the correct number of columns. PostgreSQL only allows the
275 source value to be a row constructor or a sub-SELECT. An individual
276 column's updated value can be specified as DEFAULT in the
277 row-constructor case, but not inside a sub-SELECT.
278
279
280
281PostgreSQL 16.1 2023 UPDATE(7)