SQLite
How to update existing data with SQLite
Introduction
Once a piece of data enters a database, it is very unlikely that it remains static throughout its time spent in a table. Data is updated to reflect changes in systems they represent to remain relevant and up to date. SQLite allows you to change the values in records using the UPDATE
SQL command.
UPDATE
functions similar to INSERT
(in that you specify columns and their desired values) and DELETE
(in that you provide the criteria needed to target specific records). You are also able to modify data either one by one or in bulk. In this article, we will dive into how to use UPDATE
effectively to manage your data that is already stored in tables.
Using UPDATE
to modify data
The basic syntax of the UPDATE
command looks something like this:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
The basic structure involves three seperate clauses:
- specifying a table to act on
- providing the columns you wish to update as well as their new values
- defining any criteria SQLite needs to evaluate to determine which records to match
While you can assign values directly to columns like we did above, you can also use the column list syntax too, as is often seen in INSERT
commands.
For instance, we can alter the above example to look as follows:
UPDATE my_tableSET (column1, column2) =(value1, value2)WHEREid = 1;
To update data with Prisma Client, issue an update query.
Returning records modified by the UPDATE
command
By default, SQLite does not show the number of rows impacted by an UPDATE
statement. However, SQLite added the RETURNING
clause modelled after PostgreSQL in version 3.35.0
. This clause causes the commands to return all or part of the records that were modified.
You can use the asterisk *
symbol to return all of the columns of the modified rows much like a SELECT
statement:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
Additionally, you can also specify exact columns that you care about displaying with/without an alias using AS
:
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1RETURNING column1 AS 'first column';
Updating records based on values in another table
Updating data based on new external data is a relatively streamlined process. You just need to provide the table, columns, new values, and the targeting criteria.
However, with SQLite you can also use UPDATE
to conditionally update table values based on information in another table within your database. The basic syntax will look something like this:
UPDATE table1SET table1.column1 =(SELECT table2.column1FROM table2WHERE table1.column2 = table2.column2);
Here, we are directly updating the value of column1
in table1
to be the return of a SELECT
subquery on table2
, but only in rows where column2
of table1
matches column2
of table2
. The FROM
clause indicates a connection between the two tables and WHERE
specifies the conditions.
As an example, let's suppose that we have two tables called book
and author
.
CREATE TABLE author (id INTEGER PRIMARY KEY,first_name TEXT,last_name TEXT,last_publication TEXT);CREATE TABLE book (id INTEGER PRIMARY KEY,author_id INT REFERENCES author.idtitle TEXT,publication_year INTEGER);INSERT INTO author (first_name, last_name)VALUES('Leo', 'Tolstoy'),('James', 'Joyce'),('Jean-Paul', 'Sarte');INSERT INTO book (author_id, title, publication_year)VALUES(1, 'Anna Karenina', '1877'),(1, 'War and Peace', '1867'),(2, 'Ulysses', '1920'),(2, 'Dubliners', '1914'),(3, 'Nausea', '1938');
These two tables have a relation with book.author_id
referencing author.id
. Currently the last_publication
for the author
table is NULL
. We can populate it with the author's latest published book in our book
table using FROM
and WHERE
clauses to bring the two tables together.
Here, we show an example updating last_publication
:
UPDATE authorSET last_publication=(SELECT titleFROM bookWHERE author_id = author.idORDER BY author_id, publication_year DESC);
If you query the author
table now, it will show you the title of their most recent publication in the database:
SELECT * FROM author;
+------------+------------+-----------+--------------------------+id first_name last_name last_publication+-------------+------------+-----------+--------------------------+1 Leo Tolstoy Anna Karenina2 James Joyce Ulysses3 Jean-Paul Sarte Nausea+-------------+------------+-----------+--------------------------+
Conclusion
In this guide, we took a look at the basic ways that you can modify existing data within a table using the UPDATE
command. Execution of these basic concepts allows you to specify the exact criteria necessary to identify the existing rows within a table, update column names with values, and optionally return the rows that were impacted with RETURNING
. The UPDATE
command is critical for managing your data after the initial insertion into your databases.
FAQ
You can edit records in SQLite by using an UPDATE
statement.
The basic syntax would look like:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
In SQLite, you can use the UPDATE
command looking something like the following:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREcolor = 'blue';
This syntax allows you to update in bulk depending on the WHERE
critera. In this case the columns are updated for any record where the color
column is 'blue'
.
By default, SQLite does not show the nummber of rows impacted by an UPDATE
statement.
However, SQLite does have the RETURNING
clause to return all or part of the records that were modifed.
The basic syntax looks like this with *
specifying to return all column names:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
In SQLite, there is not an IF EXISTS
clause like many other relational databases.
To control an INSERT
or UPDATE
for data existing, you will want to add an ON CONFLICT
clause to your statement.
To perform an UPDATE
with a join in SQLite, you can use the UPDATE FROM
extension. This extension to SQL allows an UPDATE
statement to be driven by other tables in the database.
With UPDATE-FROM
, you can join the target table against other tables in the database in order to help compute which rows need updating and what new values should be on those rows.