sql - PostgreSQL:外键/删除级联

标签 sql postgresql cascade

我这里有两个表:

DROP   TABLE  IF EXISTS schemas.book;
DROP   TABLE  IF EXISTS schemas.category;
DROP   SCHEMA IF EXISTS schemas;
CREATE SCHEMA schemas;

CREATE TABLE schemas.category (
  id          BIGSERIAL PRIMARY KEY,
  name        VARCHAR   NOT NULL,
  UNIQUE(name)
);

CREATE TABLE schemas.book (
  id          BIGSERIAL PRIMARY KEY,
  published   DATE      NOT NULL,
  category_id BIGINT    NOT NULL REFERENCES schemas.category
                            ON DELETE CASCADE 
                            ON UPDATE CASCADE,
  author      VARCHAR   NOT NULL,
  name        VARCHAR   NOT NULL,
  UNIQUE(published, author, name),
  FOREIGN KEY(category_id) REFERENCES schemas.category (id)
);

所以逻辑很简单,在用户删除类别 x 下的所有书籍后,x 从猫中删除,我尝试了上面的方法但不起作用,在我清理表格书籍后,表格类别仍然存在,这是怎么回事?

最佳答案

带级联删除的外键是指如果父表中的一条记录被删除,那么子表中对应的记录也会自动删除。这称为级联删除。

你说反了,不是说从子表删除,父表的记录也会被删除。

UPDATE 1:

ON DELETE CASCADE选项是指定在父表中删除相应行时是否要删除子表中的行。如果您未指定级联删除,则数据库服务器的默认行为会阻止您在其他表引用表中的数据时删除该表中的数据。

如果指定此选项,稍后当您删除父表中的行时,数据库服务器还会删除子表中与该行关联的所有行(外键)。级联删除功能的主要优点是它允许您减少执行删除操作所需的 SQL 语句的数量。

所以这就是当您从父表而不是子表中删除行时会发生什么。

因此在您的情况下,当用户从 categories 表中删除条目时,行将从 books 表中删除。

关于sql - PostgreSQL:外键/删除级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141266/

相关文章:

mysql - 使用 Inno Setup 运行 .sql 文件

php - PDO查询返回0

mysql - 在 sql 中为使用 SELECT 选择的每个 ID 运行 INSERT

mysql - 如何在不引用父级的情况下对子级进行级联删除

sql - 阿拉伯文和英文城市名称列表

sql - 计算位于边界框内的点/坐标

php - 将任何日期字符串转换为没有时区的时间戳

java - PSQL异常 : ERROR: null value in column violates not-null constraint

MySql 脚本临时将外键约束更改为级联然后返回

java - 在单个 Hibernate 事务中保存多个新实体