簡介
一旦資料進入資料庫,它在表中停留期間很可能不會保持靜態。資料會更新以反映它們所代表的系統中的變化,以保持相關性和最新狀態。SQLite 允許你使用 UPDATE SQL 命令更改記錄中的值。
UPDATE 的功能類似於 INSERT(你指定列及其所需值)和 DELETE(你提供定位特定記錄所需的條件)。你還可以逐個或批次修改資料。在本文中,我們將深入探討如何有效使用 UPDATE 來管理已儲存在表中的資料。
使用 UPDATE 修改資料
UPDATE 命令的基本語法如下所示
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
基本結構涉及三個獨立的子句
- 指定要操作的表
- 提供要更新的列及其新值
- 定義 SQLite 需要評估的任何條件以確定匹配哪些記錄
雖然你可以像我們上面那樣直接為列賦值,但你也可以使用列列表語法,這在 INSERT 命令中經常見到。
例如,我們可以將上述示例更改為以下形式
UPDATE my_tableSET (column1, column2) =(value1, value2)WHEREid = 1;
要使用 Prisma Client 更新資料,請發出更新查詢。
返回由 UPDATE 命令修改的記錄
預設情況下,SQLite 不顯示受 UPDATE 語句影響的行數。然而,SQLite 在 3.35.0 版本中添加了模仿 PostgreSQL 的 RETURNING 子句。此子句使命令返回已修改記錄的全部或部分。
你可以使用星號 * 符號來返回所有已修改行的列,非常類似於 SELECT 語句
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
此外,你還可以使用 AS 指定你關注的精確列,無論是否帶別名
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1RETURNING column1 AS 'first column';
根據另一個表中的值更新記錄
根據新的外部資料更新資料是一個相對簡化的過程。你只需要提供表、列、新值和目標條件。
然而,使用 SQLite,你還可以使用 UPDATE 根據資料庫中另一個表的資訊有條件地更新表值。基本語法將如下所示
UPDATE table1SET table1.column1 =(SELECT table2.column1FROM table2WHERE table1.column2 = table2.column2);
在這裡,我們直接將 table1 中 column1 的值更新為 table2 上 SELECT 子查詢的返回值,但僅在 table1 的 column2 與 table2 的 column2 匹配的行中。 FROM 子句表示兩個表之間的連線,WHERE 指定條件。
例如,假設我們有兩個表,名為 book 和 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');
這兩個表透過 book.author_id 引用 author.id 建立關聯。目前,author 表的 last_publication 為 NULL。我們可以使用 FROM 和 WHERE 子句將這兩個表連線起來,用作者在 book 表中的最新出版物填充它。
這裡我們展示了一個更新 last_publication 的例子
UPDATE authorSET last_publication=(SELECT titleFROM bookWHERE author_id = author.idORDER BY author_id, publication_year DESC);
如果你現在查詢 author 表,它將顯示資料庫中他們最新出版物的標題
SELECT * FROM author;
+------------+------------+-----------+--------------------------+id first_name last_name last_publication+-------------+------------+-----------+--------------------------+1 Leo Tolstoy Anna Karenina2 James Joyce Ulysses3 Jean-Paul Sarte Nausea+-------------+------------+-----------+--------------------------+
結論
在本指南中,我們探討了使用 UPDATE 命令修改表中現有資料的基本方法。執行這些基本概念允許你指定識別表中現有行、用值更新列名以及(可選地)使用 RETURNING 返回受影響行的確切標準。UPDATE 命令對於在資料首次插入資料庫後對其進行管理至關重要。
常見問題
你可以使用 UPDATE 語句在 SQLite 中編輯記錄。
基本語法如下:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
在 SQLite 中,你可以使用 UPDATE 命令,其形式大致如下:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREcolor = 'blue';
此語法允許你根據 WHERE 條件進行批次更新。在此示例中,對於 color 列為 'blue' 的任何記錄,其列都會被更新。
預設情況下,SQLite 不顯示受 UPDATE 語句影響的行數。
然而,SQLite 確實有 RETURNING 子句來返回已修改記錄的全部或部分。
基本語法如下,其中 * 表示返回所有列名:
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
在 SQLite 中,沒有像許多其他關係型資料庫那樣的 IF EXISTS 子句。
要控制現有資料的 INSERT 或 UPDATE,你需要在語句中新增一個 ON CONFLICT 子句。
要在 SQLite 中執行帶有 JOIN 的 UPDATE,你可以使用 UPDATE FROM 擴充套件。這個 SQL 擴充套件允許 UPDATE 語句由資料庫中的其他表驅動。
使用 UPDATE-FROM,你可以將目標表與資料庫中的其他表連線起來,以幫助計算哪些行需要更新以及這些行應該有哪些新值。
