UPDATE

Synopsis

The UPDATE statement updates one or more column values for a row in table. Currently, YugabyteDB can only update one row at a time, updating multiple rows is not yet supported.

Syntax

Diagram

UPDATE - 图1

using_expression

  1. using_expression = ttl_or_timestamp_expression { 'AND' ttl_or_timestamp_expression };

UPDATE - 图2

ttl_or_timestamp_expression

  1. ttl_or_timestamp_expression = 'TTL' ttl_expression | 'TIMESTAMP' timestamp_expression;

UPDATE - 图3

  1. update ::= UPDATE table_name
  2. [ USING using_expression ]
  3. SET assignment [, assignment ...]
  4. WHERE where_expression
  5. [ IF { [ NOT ] EXISTS | if_expression } ]
  6. assignment ::= { column_name | column_name'['index_expression']' } '=' expression

Where

  • table_name is an identifier (possibly qualified with a keyspace name).
  • Restrictions for ttl_expression, where_expression, and if_expression are covered in the Semantics section below.
  • See Expressions for more information on syntax rules.

Semantics

  • An error is raised if the specified table_name does not exist.
  • Update statement uses upsert semantics, meaning it inserts the row being updated if it does not already exists.
  • The USING TIMESTAMP clause indicates we would like to perform the UPDATE as if it was done at thetimestamp provided by the user. The timestamp is the number of microseconds since epoch.
  • NOTE: You should either use the USING TIMESTAMP clause in all of your statements or none ofthem. Using a mix of statements where some have USING TIMESTAMP and others do not will lead tovery confusing results.

WHERE clause

  • The where_expression and if_expression must evaluate to boolean values.
  • The where_expression must specify conditions for all primary-key columns.
  • The where_expression must not specify conditions for any regular columns.
  • The where_expression can only apply AND and = operators. Other operators are not yet supported.

IF clause

  • The if_expression can only apply to non-key columns (regular columns).
  • The if_expression can contain any logical and boolean operators.

USING clause

  • ttl_expression must be an integer value (or a bind variable marker for prepared statements).
  • timestamp_expression must be an integer value (or a bind variable marker for prepared statements).

Examples

Update a value in a table

  1. cqlsh:example> CREATE TABLE employees(department_id INT,
  2. employee_id INT,
  3. name TEXT,
  4. age INT,
  5. PRIMARY KEY(department_id, employee_id));
  1. cqlsh:example> INSERT INTO employees(department_id, employee_id, name, age) VALUES (1, 1, 'John', 30);

Update the value of a non primary-key column.

  1. cqlsh:example> UPDATE employees SET name = 'Jack' WHERE department_id = 1 AND employee_id = 1;

Using upsert semantics to update a non-existent row (i.e. insert the row).

  1. cqlsh:example> UPDATE employees SET name = 'Jane', age = 40 WHERE department_id = 1 AND employee_id = 2;
  1. cqlsh:example> SELECT * FROM employees;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+-----
  3. 1 | 1 | Jack | 30
  4. 1 | 2 | Jane | 40

Conditional update using the IF clause

The supported expressions are allowed in the ‘SET’ assignment targets.

  1. cqlsh:example> UPDATE employees SET age = age + 1 WHERE department_id = 1 AND employee_id = 1 IF name = 'Jack';

  1. [applied]

  1. True

Using upsert semantics to add a row, age is not set so will be ‘null’.

  1. cqlsh:example> UPDATE employees SET name = 'Joe' WHERE department_id = 2 AND employee_id = 1 IF NOT EXISTS;

  1. [applied]

  1. True

  1. cqlsh:example> SELECT * FROM employees;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 2 | 1 | Joe | null
  4. 1 | 1 | Jack | 31
  5. 1 | 2 | Jane | 40

Update with expiration time using the USING TTL clause.

The updated value(s) will persist for the TTL duration.

  1. cqlsh:example> UPDATE employees USING TTL 10 SET age = 32 WHERE department_id = 1 AND employee_id = 1;
  1. cqlsh:example> SELECT * FROM employees WHERE department_id = 1 AND employee_id = 1;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 1 | 1 | Jack | 32

11 seconds after the update (value will have expired).

  1. cqlsh:example> SELECT * FROM employees WHERE department_id = 1 AND employee_id = 1;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 1 | 1 | Jack | null

Update row with the USING TIMESTAMP clause

You can do this as shown below.

  1. cqlsh:foo> INSERT INTO employees(department_id, employee_id, name, age) VALUES (1, 4, 'Jeff', 20) USING TIMESTAMP 1000;
  1. cqlsh:foo> SELECT * FROM employees;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 1 | 1 | Jack | null
  4. 1 | 2 | Jane | 40
  5. 1 | 4 | Jeff | 20
  6. 2 | 1 | Joe | null
  7. (4 rows)

Now update the employees table.

  1. cqlsh:foo> UPDATE employees USING TIMESTAMP 500 SET age = 30 WHERE department_id = 1 AND employee_id = 4;

Not applied since timestamp is lower than 1000.

  1. cqlsh:foo> SELECT * FROM employees;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 1 | 1 | Jack | null
  4. 1 | 2 | Jane | 40
  5. 1 | 4 | Jeff | 20
  6. 2 | 1 | Joe | null
  7. (4 rows)
  1. cqlsh:foo> UPDATE employees USING TIMESTAMP 1500 SET age = 30 WHERE department_id = 1 AND employee_id = 4;

Applied since timestamp is higher than 1000.

  1. cqlsh:foo> SELECT * FROM employees;
  1. department_id | employee_id | name | age
  2. ---------------+-------------+------+------
  3. 1 | 1 | Jack | null
  4. 1 | 2 | Jane | 40
  5. 1 | 4 | Jeff | 30
  6. 2 | 1 | Joe | null
  7. (4 rows)

See also