删除数据

最近更新时间: 2026-03-13 09:03:00

表中插入数据后,可以使用 DELETE 语句来删除表中的记录。
语法如下:

DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ USING from_item [, ...] ]
    [ WHERE condition ]

参数说明:

  • table_name: 要从其中删除行的表名(可以是模式限定的)。如果在表名前指定 ONLY,只会从提到的表中删除匹配的行。如果没有指定 ONLY,还会删除该表的任何继承表中的匹配行。可选地,可以在表名后面指定*来显式指定要包括继承表。
  • alias: 目标表的一个别名。提供别名时,它会完全隐藏该表的真实名称。例如,对于 DELETE FROM foo AS fDELETE语句的剩余部分都会用 f 而不是 foo 来引用该表。
  • from_item: 一个表的表达式列表,它允许在WHERE条件中出现来自其他表的列。这和SELECT语句的 FROM 子句中指定的表列表相似。例如,可以指定表的别名。除非想要进行自连接,否则不要在 from_item 再写上目标表。
  • condition: 一个返回boolean类型值的表达式。只有让这个表达式返回true的行才将被删除。

示例

1、 删除部分数据
通过 DELETE 语句加 WHERE 条件,可以删除表中满足条件的部分数据。

tdsql=#\d tbase_insert;
           Table "public.tbase_insert"
Column   |  Type   | Collation | Nullable |  Default 
-----------+---------+-----------+----------+------------
id        | numeric |           | not null |
name      | text    |           | not null |
value     | numeric |           |          |
create_ts | date    |           | not null | CURRENT_DATE
Indexes:
"tbase_insert_pkey" PRIMARY KEY, btree (id)
"uniq_idx_value" UNIQUE, btree (value)

删除 tbase_insert 表中符合 value = 101 的所有行记录,示例如下:

tdsql=#  DELETE FROM tbase_insert WHERE value = 101;
DELETE 1

筛选表 tbase_insertvalue 列数据,分别执行多条语句分批删除 value < 100value < 200value < 300 的数据。

tdsql=# DELETE FROM tbase_insert WHERE value < 100;

tdsql=# DELETE FROM tbase_insert WHERE value < 200;

tdsql=# DELETE FROM tbase_insert WHERE value < 300;

2、 删除所有数据
当表中的数据量较小时,可以直接使用 DELETE 语句删除所有行记录。
删除 tbase_insert 表中的所有行数据。

tdsql=# DELETE FROM tbase_insert;

3、返回删除的数据

tdsql=# create table del1 (i int, j int);
CREATE TABLE
tdsql=# insert into del1 values (1,1);
INSERT 0 1
tdsql=# delete from del1 returning *;
 i | j 
---+---
 1 | 1
(1 row)

DELETE 1

当表中数据记录过多,通过DELETE执行全部删除可能会出现性能问题,建议根据表的内容结合 WHERE 条件进行分批删除,或者直接使用 TRUNCATE TABLE 语句清空表数据。
4、多表关联删除数据
示例中找到 del_tablei 列和 src_tablei 列相同的记录,并将 del_table 中该行记录删除。

tdsql=# create table del_table (i int, j int);
CREATE TABLE
tdsql=# insert into del_table values (1,1),(2,2);
COPY 2
tdsql=# select * from del_table;
i | j 
---+---
 1 | 1
 2 | 2
(2 rows)

tdsql=# select * from src_table;
i | j 
---+---
 1 | 2
(1 row)
tdsql=# delete from del_table using src_table where del_table.i=src_table.i;
DELETE 1
tdsql=# select * from del_table;
i | j 
---+---
 2 | 2
(1 rows)

使用 TRUNCATE TABLE 语句清空表数据

TRUNCATE 可以从一组表中快速地移除所有行。 它具有和在每个表上执行无条件DELETE相同的 效果,不过它会更快,因为它没有实际扫描表。此外,它会立刻回收磁盘空间, 而不是要求一个后续的VACUUM操作。
语法如下:

TRUNCATE [TABLE] table_name;

示例:

tdsql=# TRUNCATE TABLE tbase_insert;
TRUNCATE TABLE