我有两个像这样的表:
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语句的数量。
因此,这是当您从父表而不是子表中删除行时发生的一切。
因此,在您的情况下,当用户从CATs表中删除条目时,行将从books表中删除。:)
希望这对您有所帮助:)