表中插入数据后,可以使用 DELETE 语句来删除表中的记录。
语法如下:
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING from_item [, ...] ]
[ WHERE condition ]
参数说明:
table_name: 要从其中删除行的表名(可以是模式限定的)。如果在表名前指定ONLY,只会从提到的表中删除匹配的行。如果没有指定ONLY,还会删除该表的任何继承表中的匹配行。可选地,可以在表名后面指定*来显式指定要包括继承表。alias: 目标表的一个别名。提供别名时,它会完全隐藏该表的真实名称。例如,对于DELETE FROM foo AS f,DELETE语句的剩余部分都会用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_insert 中 value 列数据,分别执行多条语句分批删除 value < 100,value < 200,value < 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_table 中 i 列和 src_table 中 i 列相同的记录,并将 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