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 教程。