我有两张这样的桌子:

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从CAT中删除,我try 了上面的方法,但不起作用,在我清理了table book后,table category仍然填充,怎么了?

推荐答案

带有级联删除的外键意味着,如果父表中的记录被删除,那么子表中相应的记录将自动被删除.这称为级联删除.

您是以相反的方式说的,这并不是说当您从子表中删除时,记录将从父表中删除.

UPDATE 1:

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

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

So it's all about what will happen when you delete rows from Parent table not from child table.

所以,在您的情况下,当用户从CATs表中删除条目时,将从books表中删除行.:)

希望这对你有帮助:)

Sql相关问答推荐

优化SQL查询流

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

如何转换和汇总行数

LEFT JOIN不显示计数0我期望的方式

雅典娜嵌套Json提取液

在Oracle SQL中将列值转换为行

我怎样才能得到列值对应的最大值在另一个?

如何将我的联接数据放入每个用户每月多行的列中?

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

来自按PostgreSQL分组的最小日期

SQL到Snowflake-转换嵌套的SELECT(值

将两列相加为同一表中的行的查询

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

其中使用表名作为;行值;记录?

如何在T-SQL中编写row_number的WHERE子句?

输出连续出现两次以上的行

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

SQL Server - 复杂场景 - 比较状态并填充值到后续行

按公司和产品查询最近发票的平均价格的SQL查询

运算符不存在:integer = bigint[]