分享至

簡介

一旦資料進入資料庫,它在表中停留期間很可能不會保持靜態。資料會更新以反映它們所代表的系統中的變化,以保持相關性和最新狀態。SQLite 允許你使用 UPDATE SQL 命令更改記錄中的值。

UPDATE 的功能類似於 INSERT(你指定列及其所需值)和 DELETE(你提供定位特定記錄所需的條件)。你還可以逐個或批次修改資料。在本文中,我們將深入探討如何有效使用 UPDATE 來管理已儲存在表中的資料。

使用 UPDATE 修改資料

UPDATE 命令的基本語法如下所示

UPDATE my_table
SET
column1 = value1,
column2 = value2,
WHERE
id = 1;

基本結構涉及三個獨立的子句

  • 指定要操作的表
  • 提供要更新的列及其新值
  • 定義 SQLite 需要評估的任何條件以確定匹配哪些記錄

雖然你可以像我們上面那樣直接為列賦值,但你也可以使用列列表語法,這在 INSERT 命令中經常見到。

例如,我們可以將上述示例更改為以下形式

UPDATE my_table
SET (column1, column2) =
(value1, value2)
WHERE
id = 1;

返回由 UPDATE 命令修改的記錄

預設情況下,SQLite 不顯示受 UPDATE 語句影響的行數。然而,SQLite 在 3.35.0 版本中添加了模仿 PostgreSQLRETURNING 子句。此子句使命令返回已修改記錄的全部或部分。

你可以使用星號 * 符號來返回所有已修改行的列,非常類似於 SELECT 語句

UPDATE my_table
SET
column1 = value1,
column2 = value2,
WHERE
id = 1
RETURNING *;

此外,你還可以使用 AS 指定你關注的精確列,無論是否帶別名

UPDATE my_table
SET
column1 = value1,
column2 = value2
WHERE
id = 1
RETURNING column1 AS 'first column';

根據另一個表中的值更新記錄

根據新的外部資料更新資料是一個相對簡化的過程。你只需要提供表、列、新值和目標條件。

然而,使用 SQLite,你還可以使用 UPDATE 根據資料庫中另一個表的資訊有條件地更新表值。基本語法將如下所示

UPDATE table1
SET table1.column1 =(
SELECT table2.column1
FROM table2
WHERE table1.column2 = table2.column2);

在這裡,我們直接將 table1column1 的值更新為 table2SELECT 子查詢的返回值,但僅在 table1column2table2column2 匹配的行中。 FROM 子句表示兩個表之間的連線,WHERE 指定條件。

例如,假設我們有兩個表,名為 bookauthor

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.id
title 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_publicationNULL。我們可以使用 FROMWHERE 子句將這兩個表連線起來,用作者在 book 表中的最新出版物填充它。

這裡我們展示了一個更新 last_publication 的例子

UPDATE author
SET last_publication=(
SELECT title
FROM book
WHERE author_id = author.id
ORDER BY author_id, publication_year DESC);

如果你現在查詢 author 表,它將顯示資料庫中他們最新出版物的標題

SELECT * FROM author;
+------------+------------+-----------+--------------------------+
id first_name last_name last_publication
+-------------+------------+-----------+--------------------------+
1 Leo Tolstoy Anna Karenina
2 James Joyce Ulysses
3 Jean-Paul Sarte Nausea
+-------------+------------+-----------+--------------------------+

結論

在本指南中,我們探討了使用 UPDATE 命令修改表中現有資料的基本方法。執行這些基本概念允許你指定識別表中現有行、用值更新列名以及(可選地)使用 RETURNING 返回受影響行的確切標準。UPDATE 命令對於在資料首次插入資料庫後對其進行管理至關重要。

常見問題

你可以使用 UPDATE 語句在 SQLite 中編輯記錄。

基本語法如下:

UPDATE my_table
SET
column1 = value1,
column2 = value2,
WHERE
id = 1;

在 SQLite 中,你可以使用 UPDATE 命令,其形式大致如下:

UPDATE my_table
SET
column1 = value1,
column2 = value2,
WHERE
color = 'blue';

此語法允許你根據 WHERE 條件進行批次更新。在此示例中,對於 color 列為 'blue' 的任何記錄,其列都會被更新。

預設情況下,SQLite 不顯示受 UPDATE 語句影響的行數。

然而,SQLite 確實有 RETURNING 子句來返回已修改記錄的全部或部分。

基本語法如下,其中 * 表示返回所有列名:

UPDATE my_table
SET
column1 = value1,
column2 = value2,
WHERE
id = 1
RETURNING *;

在 SQLite 中,沒有像許多其他關係型資料庫那樣的 IF EXISTS 子句。

要控制現有資料的 INSERTUPDATE,你需要在語句中新增一個 ON CONFLICT 子句

要在 SQLite 中執行帶有 JOIN 的 UPDATE,你可以使用 UPDATE FROM 擴充套件。這個 SQL 擴充套件允許 UPDATE 語句由資料庫中的其他表驅動。

使用 UPDATE-FROM,你可以將目標表與資料庫中的其他表連線起來,以幫助計算哪些行需要更新以及這些行應該有哪些新值。

作者
Alex Emerich

Alex Emerich

Alex 是一個典型的觀鳥者、嘻哈愛好者和書呆子,他也喜歡撰寫關於資料庫的文章。他目前居住在柏林,在那裡可以看到他像利奧波德·布魯姆(Leopold Bloom)一樣漫無目的地在城市中行走。
© . This site is unofficial and not affiliated with Prisma Data, Inc.