简介
在表中添加和删除记录是数据库执行的最常见操作之一。添加数据包括指定您希望向其中添加值的表和列名称,以及您希望输入到每个字段中的值。删除记录包括识别正确的行或多行,并将其从表中删除。
在本指南中,我们将介绍如何在 PostgreSQL 中使用 SQL INSERT
和 DELETE
命令。这包括基本语法、如何返回有关已处理数据的数据信息,以及如何在单个语句中添加或删除多行。
查看表的结构
在使用 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_lengthFROM 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 | 45last_name | character varying | | NO | 45last_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_name
和 last_name
列提供值,同时将其他列留空,以便使用其默认值填充。如果您查询表,您可以看到已添加新记录
SELECT * FROM employee;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------1 | Bob | Smith | 2020-08-19 21:07:00.952454(1 row)
您还可以使用 Prisma Client 通过发出 create query 将数据添加到表中。
从 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_tableWHERE <condition>;
例如,要删除 employee
表中 first_name
设置为 Abigail
的每一行,我们可以键入以下内容
DELETE FROM employeeWHERE first_name = 'Abigail';
DELETE 1
此处的返回值指示 DELETE
命令已处理,并删除了一行。
要使用 Prisma Client 从表中删除数据,请使用 delete query。
从 DELETE
语句返回数据
与 INSERT
命令一样,您可以通过添加 RETURNING
子句来返回受影响的行或已删除行中的特定列
DELETE FROM my_tableWHERE <condition>RETURNING *;
例如,我们可以通过返回此处已删除的 employee
的所有列来验证是否删除了正确的记录
DELETE FROM employeeWHERE 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 employeeWHERE employee_id in (3,4)RETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------3 | Delores | Muniz | 2020-08-19 21:17:06.9436084 | Simone | Kohler | 2020-08-19 21:19:19.298833(2 rows)DELETE 2
您甚至可以省略 WHERE
子句以删除给定表中的所有行
DELETE FROM employeeRETURNING *;
employee_id | first_name | last_name | last_update-------------+------------+-----------+----------------------------2 | Sue | Berns | 2020-08-19 21:15:01.76226 | Tamal | Wayne | 2020-08-19 22:11:53.4085317 | Katie | Singh | 2020-08-19 22:11:53.4085318 | Filipe | Espinosa | 2020-08-19 22:11:53.408531(4 rows)DELETE 4
但是请注意,使用 DELETE
清空表数据不如 TRUNCATE
命令高效,后者可以在不扫描表的情况下删除数据。
Prisma Client 使用一个名为 deleteMany 的单独查询一次删除多行数据。
结论
在本文中,我们介绍了一些最重要的命令来控制 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
语句来检查两个不同的行是否具有相同的值,然后删除重复项。
此外,您可以使用子查询删除重复项,或者使用包含以下步骤的立即表
- 创建一个与应删除重复行的源表结构相同的新表。
- 将源表中的非重复行插入到立即表中。
- 删除源表。
- 将立即表重命名为源表的名称。
如果记录在 PostgreSQL 中存在,您可以使用包含 EXISTS
的 WHERE
子句的 DELETE
语句来删除它。EXISTS
子句需要一个子查询。
基本语法如下所示
DELETE FROM table_nameWHERE EXISTS ( subquery );
PostgreSQL 仅允许在其 SELECT
语句中使用 LIMIT
子句。因此,为了在 DELETE
语句中使用它,您必须包含 SELECT
。
语法可能如下所示
DELETE FROM table_nameWHERE field_name IN (SELECT field_name FROM table_name LIMIT 1);