ZetCode

PostgreSQL DELETE 语句

最后修改时间:2025年3月1日

PostgreSQL DELETE 语句用于从表中删除行。它是一项强大的操作,允许您删除表中的特定行或所有行。本教程将通过实际示例介绍如何使用 DELETE 语句。

DELETE 语句可以与 WHERE 子句一起使用来过滤要删除的行,或者不带 WHERE 子句来删除表中的所有行。重要的是要谨慎使用此语句,因为它会永久删除数据。

基本 DELETE 语句

此示例演示了如何从 books 表中删除单行

basic_delete.sql
-- 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 表中删除多行

delete_multiple_rows.sql
-- 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 表中删除所有行

delete_all_rows.sql
-- 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 语句将删除表中的所有行。

使用子查询删除

此示例演示了如何使用子查询删除行

delete_with_subquery.sql
-- 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 删除行

delete_with_join.sql
-- 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 子句连接 booksauthors 表,WHERE 子句过滤要删除的行。

使用 RETURNING 子句删除

此示例演示了如何删除行并返回被删除的数据

delete_returning.sql
-- 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 删除

此示例演示了如何从父表中删除行并自动删除子表中相关的行

delete_cascade.sql
-- 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 删除

此示例演示了如何删除有限数量的行

delete_with_limit.sql
-- 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 子句删除行

delete_with_exists.sql
-- 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 的最佳实践

来源

PostgreSQL 文档

在本文中,我们通过实际示例和最佳实践,探讨了如何使用 PostgreSQL DELETE 语句从表中删除数据。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Python 教程