分享到

介紹

新增和刪除表中的記錄是資料庫執行的最常見操作之一。新增資料涉及指定要新增值的名稱,以及要輸入到每個欄位中的值。刪除記錄涉及識別正確的行或多行並將其從表中刪除。

在本指南中,我們將介紹如何在PostgreSQL中使用SQL INSERTDELETE命令。這包括基本語法、如何返回有關已處理資料的資訊,以及如何在一個語句中新增或刪除多行。

審查表結構

在使用INSERT命令之前,您必須瞭解表的結構,以便能夠滿足表列、資料型別約束所施加的要求。根據您的資料庫客戶端,有幾種不同的方法可以做到這一點。

如果您正在使用psql命令列客戶端,查詢此資訊最直接的方法是使用該工具內建的\d+元命令。

例如,要查詢名為employee的表的結構,您可以鍵入以下內容

\d+ employee
Table "public.employee"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+-----------------------------------------------+----------+--------------+-------------
employee_id | integer | | not null | nextval('employee_employee_id_seq'::regclass) | plain | |
first_name | character varying(45) | | not null | | extended | |
last_name | character varying(45) | | not null | | extended | |
last_update | timestamp without time zone | | not null | now() | plain | |
Indexes:
"employee_pkey" PRIMARY KEY, btree (employee_id)
"idx_employee_last_name" btree (last_name)
Triggers:
last_updated BEFORE UPDATE ON employee FOR EACH ROW EXECUTE FUNCTION last_updated()
Access method: heap

輸出顯示錶的列名、資料型別和預設值等資訊。

\d+元命令僅適用於psql客戶端,因此如果您使用不同的客戶端,可能需要直接查詢表資訊。您可以透過以下查詢獲取大多數相關資訊

SELECT column_name, data_type, column_default, is_nullable, character_maximum_length
FROM information_schema.columns WHERE table_name ='employee';
column_name | data_type | column_default | is_nullable | character_maximum_length
-------------+-----------------------------+-----------------------------------------------+-------------+--------------------------
employee_id | integer | nextval('employee_employee_id_seq'::regclass) | NO |
first_name | character varying | | NO | 45
last_name | character varying | | NO | 45
last_update | timestamp without time zone | now() | NO |
(4 rows)

這些應該能讓您很好地瞭解表的結構,以便您正確插入值。

使用INSERT向表中新增新記錄

SQL INSERT命令用於向現有表新增資料行。一旦您瞭解了表的結構,就可以構建一個命令,將表的列與您希望為新記錄插入的相應值進行匹配。

該命令的基本語法如下

INSERT INTO my_table(column1, column2)
VALUES ('value1', 'value2');

列列表中的列直接對應於值列表中提供的值。

預設情況下,INSERT命令返回物件ID(通常為0)和成功插入的行數

INSERT 0 1

例如,要將新員工插入到上面列出的employee表中,我們可以鍵入

INSERT INTO employee(first_name, last_name)
VALUES ('Bob', 'Smith');
INSERT 0 1

在這裡,我們為first_namelast_name列提供值,而其他列則由其預設值填充。如果您查詢該表,您會看到新記錄已被新增

SELECT * FROM employee;
employee_id | first_name | last_name | last_update
-------------+------------+-----------+----------------------------
1 | Bob | Smith | 2020-08-19 21:07:00.952454
(1 row)

INSERT語句返回資料

如果您想獲取有關新增到表中的資料的額外資訊,可以在語句末尾包含RETURNING子句。RETURNING子句指定了要顯示剛插入記錄的哪些列。

例如,要顯示剛插入記錄的所有列,您可以鍵入以下內容

INSERT INTO my_table(column_name, column_name_2)
VALUES ('value', 'value2')
RETURNING *;
column_name | column_name_2
-------------+---------------
value | value2
(1 row)
INSERT 0 1

使用employee表,它將看起來像這樣

INSERT INTO employee(first_name, last_name)
VALUES ('Sue', 'Berns')
RETURNING *;
employee_id | first_name | last_name | last_update
-------------+------------+-----------+--------------------------
2 | Sue | Berns | 2020-08-19 21:15:01.7622
(1 row)
INSERT 0 1

您也可以選擇只從插入中返回特定列。例如,這裡我們只關心新員工的ID

INSERT INTO employee(first_name, last_name)
VALUES ('Delores', 'Muniz')
RETURNING employee_id;
employee_id
-------------
3
(1 row)
INSERT 0 1

和往常一樣,您也可以使用列別名來更改輸出中的列名

INSERT INTO employee(first_name, last_name)
VALUES ('Simone', 'Kohler')
RETURNING employee_id AS "Employee ID";
Employee ID
-------------
4
(1 row)
INSERT 0 1

使用INSERT一次新增多行

一次插入一條記錄比一次插入多行更耗時、效率更低。PostgreSQL允許您指定要新增到同一表的多個行。每個新行都用括號括起來,每組括號之間用逗號分隔。

多記錄插入的基本語法如下

INSERT INTO my_table(column_name, column_name_2)
VALUES
('value', 'value2'),
('value3', 'value4'),
('value5', 'value6');

對於我們一直引用的employee表,您可以透過鍵入以下內容在一個語句中新增四名新員工

INSERT INTO employee(first_name, last_name)
VALUES
('Abigail', 'Spencer'),
('Tamal', 'Wayne'),
('Katie', 'Singh'),
('Felipe', 'Espinosa');
INSERT 0 4

使用DELETE從表中刪除行

SQL DELETE命令用於從表中刪除行,作為INSERT的補充操作。為了從表中刪除行,您必須透過在WHERE子句中提供匹配條件來標識您希望刪除的行。

基本語法如下

DELETE FROM my_table
WHERE <condition>;

例如,要刪除我們employee表中所有first_name設定為Abigail的行,我們可以鍵入以下內容

DELETE FROM employee
WHERE first_name = 'Abigail';
DELETE 1

此處的返回值表示DELETE命令已處理,並刪除了單行。

DELETE語句返回資料

INSERT命令一樣,您可以透過新增RETURNING子句來返回受影響的行或已刪除行中的特定列

DELETE FROM my_table
WHERE <condition>
RETURNING *;

例如,我們可以透過返回此處已刪除employee的所有列來驗證是否刪除了正確的記錄

DELETE FROM employee
WHERE last_name = 'Smith'
RETURNING *;
employee_id | first_name | last_name | last_update
-------------+------------+-----------+----------------------------
1 | Bob | Smith | 2020-08-19 21:07:00.952454
(1 row)
DELETE 1

使用DELETE一次刪除多行

您可以透過修改WHERE子句中指定的選擇條件,使用DELETE一次刪除多個專案。

例如,要按ID刪除多行,您可以鍵入以下內容

DELETE FROM employee
WHERE employee_id in (3,4)
RETURNING *;
employee_id | first_name | last_name | last_update
-------------+------------+-----------+----------------------------
3 | Delores | Muniz | 2020-08-19 21:17:06.943608
4 | Simone | Kohler | 2020-08-19 21:19:19.298833
(2 rows)
DELETE 2

您甚至可以省略WHERE子句來刪除給定表中的所有行

DELETE FROM employee
RETURNING *;
employee_id | first_name | last_name | last_update
-------------+------------+-----------+----------------------------
2 | Sue | Berns | 2020-08-19 21:15:01.7622
6 | Tamal | Wayne | 2020-08-19 22:11:53.408531
7 | Katie | Singh | 2020-08-19 22:11:53.408531
8 | Filipe | Espinosa | 2020-08-19 22:11:53.408531
(4 rows)
DELETE 4

但請注意,使用DELETE清空表中的資料不如TRUNCATE命令高效,後者無需掃描表即可刪除資料。

結論

在本文中,我們介紹了一些最重要的命令,用於控制PostgreSQL表中的資料。INSERT命令可用於向表新增新資料,而DELETE命令則指定應刪除哪些行。這兩個命令都能夠返回它們影響的行,並且可以一次操作多行。

這兩個命令是管理表中記錄數量增減的主要機制。掌握它們的基本語法以及它們與其他子句結合使用的方式,將使您能夠根據需要填充和清理表。

常見問題

多記錄插入的基本語法如下

INSERT INTO my_table(column_name, column_name_2)
VALUES
('value', 'value2'),
('value3', 'value4'),
('value5', 'value6');

一個使用員工資料的示例將如下所示

INSERT INTO employee(first_name, last_name)
VALUES
('Abigail', 'Spencer'),
('Tamal', 'Wayne'),
('Katie', 'Singh'),
('Felipe', 'Espinosa');

在PostgreSQL中插入前檢查記錄是否存在的一種方法是使用EXISTS子查詢表示式

EXISTS條件與子查詢結合使用,用於檢查您要查詢的資料。如果子查詢返回至少一行,則認為條件滿足。如果沒有返回行,則記錄尚不存在。

基本語法如下

WHERE EXISTS ( subquery );

PostgreSQL中有幾種刪除重複行的方法。您可以使用DELETE USING語句來檢查兩行是否具有相同的值,然後刪除重複項。

此外,您可以使用子查詢刪除重複項,或者透過使用臨時表並按照以下步驟操作:

  1. 建立一個新表,其結構與應刪除重複行的表相同。
  2. 將源表中的不同行插入到臨時表中。
  3. 刪除源表。
  4. 將臨時表重新命名為源表的名稱。

您可以使用包含EXISTSWHERE子句的DELETE語句來刪除PostgreSQL中存在的記錄。EXISTS子句需要一個子查詢。

基本語法如下

DELETE FROM table_name
WHERE EXISTS ( subquery );

PostgreSQL只允許在其SELECT語句中使用LIMIT子句。因此,要在DELETE語句中使用它,您必須包含一個SELECT

語法可能如下所示

DELETE FROM table_name
WHERE field_name IN (
SELECT field_name FROM table_name LIMIT 1);
關於作者
Justin Ellingwood

Justin Ellingwood

Justin自2013年以來一直撰寫有關資料庫、Linux、基礎設施和開發者工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不需要以第三人稱寫作,這對所有相關方來說都是一種解脫。
© . This site is unofficial and not affiliated with Prisma Data, Inc.