问题:PostgreSQL:外键/删除级联

我有两个像这里的表:

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 选项用于指定在父表中删除相应行时是否要删除子表中的行。如果您不指定级联删除,则数据库服务器的默认行为会阻止您在其他表引用该表时删除该表中的数据。

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

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

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

希望这可以帮助你:)

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐