PostgreSQL DELETE 语句
最后修改时间:2025年3月1日
PostgreSQL DELETE
语句用于从表中删除行。它是一项强大的操作,允许您删除表中的特定行或所有行。本教程将通过实际示例介绍如何使用 DELETE
语句。
DELETE
语句可以与 WHERE
子句一起使用来过滤要删除的行,或者不带 WHERE
子句来删除表中的所有行。重要的是要谨慎使用此语句,因为它会永久删除数据。
基本 DELETE 语句
此示例演示了如何从 books
表中删除单行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE book_id = 101;
DELETE FROM
语句指定表,WHERE
子句标识要删除的行。
删除多行
此示例演示了如何从 books
表中删除多行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE genre = 'Sci-Fi';
WHERE
子句按 genre
列过滤行,并将删除所有匹配的行。
删除所有行
此示例演示了如何从 books
表中删除所有行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books;
不带 WHERE
子句的 DELETE FROM
语句将删除表中的所有行。
使用子查询删除
此示例演示了如何使用子查询删除行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE book_id IN ( SELECT book_id FROM books WHERE publication_year < 2000 );
子查询根据 publication_year
列标识要删除的行。
使用 JOIN 删除
此示例演示了如何使用 JOIN
删除行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); -- CREATE TABLE authors ( -- author_id INTEGER PRIMARY KEY, -- name VARCHAR(100) NOT NULL -- ); DELETE FROM books USING authors WHERE books.author = authors.name AND authors.name = 'Jane Doe';
USING
子句连接 books
和 authors
表,WHERE
子句过滤要删除的行。
使用 RETURNING 子句删除
此示例演示了如何删除行并返回被删除的数据
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE genre = 'Horror' RETURNING *;
RETURNING
子句返回被删除的行,这对于验证或进一步处理很有用。
使用 ON DELETE CASCADE 删除
此示例演示了如何从父表中删除行并自动删除子表中相关的行
-- CREATE TABLE authors ( -- author_id INTEGER PRIMARY KEY, -- name VARCHAR(100) NOT NULL -- ); -- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author_id INTEGER REFERENCES authors(author_id) ON DELETE CASCADE, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM authors WHERE author_id = 1;
ON DELETE CASCADE
约束确保从 authors
表中删除一行也会从 books
表中删除相关的行。
使用 LIMIT 删除
此示例演示了如何删除有限数量的行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE genre = 'Mystery' LIMIT 2;
LIMIT
子句限制了删除的行数。
使用 EXISTS 删除
此示例演示了如何使用 EXISTS
子句删除行
-- CREATE TABLE books ( -- book_id INTEGER PRIMARY KEY, -- title VARCHAR(100) NOT NULL, -- author VARCHAR(100) NOT NULL, -- genre VARCHAR(50) NOT NULL, -- price NUMERIC(5,2) NOT NULL CHECK (price >= 0), -- publication_year INTEGER NOT NULL CHECK (publication_year BETWEEN 1900 AND 2025) -- ); DELETE FROM books WHERE EXISTS ( SELECT 1 FROM authors WHERE authors.name = books.author AND authors.name = 'John Smith' );
EXISTS
子句检查 authors
表中是否存在相关行。
使用 DELETE 的最佳实践
- 谨慎使用 WHERE 子句: 始终仔细检查
WHERE
子句,以避免删除意外的行。 - 备份数据: 在执行大量删除之前,请备份您的数据。
- 使用事务: 将
DELETE
语句包装在事务中以确保原子性。 - 使用 SELECT 进行测试: 在删除之前,先使用
SELECT
语句测试您的WHERE
子句。
来源
在本文中,我们通过实际示例和最佳实践,探讨了如何使用 PostgreSQL DELETE
语句从表中删除数据。
作者
列出 所有 Python 教程。