联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:15897897836 QQ:2106973531

PG存在的级联删除(ON DELETE CASCADE)

在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

假设的表结构

假设你的表结构如下:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(user_id),
    order_date DATE NOT NULL
);

插入一些示例数据

首先,插入一些示例数据:

INSERT INTO users (username) VALUES ('Alice'), ('Bob'), ('Charlie');

INSERT INTO orders (user_id, order_date) VALUES 
(1, '2023-01-01'), 
(1, '2023-02-01'), 
(2, '2023-03-01');

查看数据

查看插入的数据:

SELECT * FROM users;
 user_id | username 
---------+----------
       1 | Alice
       2 | Bob
       3 | Charlie
(3 rows)
SELECT * FROM orders;
order_id | user_id | order_date 
----------+---------+------------
        1 |       1 | 2023-01-01
        2 |       1 | 2023-02-01
        3 |       2 | 2023-03-01
(3 rows)

删除订单表中的一条数据

假设你要删除订单表中 order_id 为 1 的数据:

DELETE FROM orders WHERE order_id = 1;
order_id | user_id | order_date 
----------+---------+------------
        2 |       1 | 2023-02-01
        3 |       2 | 2023-03-01
(2 rows)

删除用户表中的一条数据

假设你要删除用户表中 user_id 为 1 的数据:

DELETE FROM users WHERE user_id = 1;
ERROR:  update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL:  Key (user_id)=(1) is still referenced from table "orders".

结果

在执行上述删除操作后,PostgreSQL 会检查外键约束。如果你没有设置级联删除(ON DELETE CASCADE),那么在删除用户表中的数据时,如果该用户在订单表中仍有相关记录,删除操作将会失败。

设置级联删除

如果你希望在删除用户表中的数据时,自动删除订单表中相关的记录,可以在创建表时设置级联删除:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(user_id) ON DELETE CASCADE,
    order_date DATE NOT NULL
);

这样,当你删除用户表中的数据时,PostgreSQL 会自动删除订单表中所有相关的记录。

postgres=# DELETE FROM orders WHERE order_id = 1;
DELETE 1
postgres=# DELETE FROM users WHERE user_id = 1;
DELETE 1

实验步骤总结

  1. 创建用户表和订单表,并设置外键约束。

  2. 插入一些示例数据。

  3. 删除订单表中的一条数据。

  4. 尝试删除用户表中的一条数据。

  5. 如果需要,设置级联删除以自动删除相关记录。

通过这些步骤,你可以验证外键约束和删除操作在 PostgreSQL 中的行为。

相关文章

从安装PostgreSQL开始
通过以下步骤,你可以在 CentOS 7 上成功安装和配置 PostgreSQL 14。首先,设置 RPM 仓库并安装 PostgreSQL 14 服务器。然后,创建自定义数据存储目录并初始化数据库。接下来,修改启动脚本以使用自定义数据存储目录,并设置 PostgreSQL 监听所有 IP 地址。为了增强安全性,配置密码认证并修改 postgres 超级用户密码。最后,确保所有配置生效,重启 PostgreSQL 服务。通过这些步骤,你将拥有一个配置良好且安全的 PostgreSQL 数据库环境。如果在过程中遇到任何问题,请参考官方文档或寻求专业支持。
checkpoint是什么东西?一个位置?还是一个操作?
checkpoint是一个操作,执行这个操作的开始时刻,会记录当前开始时刻的 WAL 位置作为重做点,这个位置会被保存在文件中。 然后将该重做点之前所有 shared buffer 中的脏页均被刷入到存储。checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。
PostgreSQL 内参:深入解析运行原理【快照篇】
来源于灿哥的:《PostgreSQL 内参:深入解析运行原理》,非常好的一本书。
PG存在的级联删除(ON DELETE CASCADE)
在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册