关于删除级联的postgresql

我有两张桌子:

表格:
身份证、姓名、描述
表十:
身份证,姓名,你的身份证

我在TableX中添加了一个外键(y\u id引用了DELETE CASCADE上的tableY id)。
当我从TableX中删除时,TableYid保留下来(理论上应该删除它)。
我想我误解了DELETE CASCADE选项的工作原理。谁知道我做错了什么

我在DELETE CASCADE上也看到了这一点,但对我来说没有多大意义

简短回答

在“删除层叠”上指定约束选项。在您的情况下(假设您有表_x和依赖于表_x的表_y),当您删除表_x中的行并且该行从表_y引用时,表_x中的行将被删除,并且表_y中引用该行的所有行也将被删除

当需要删除表并依赖于此表时,请使用带有级联关键字的DROP table

有关拖放、删除和删除级联约束选项的详细信息

删除与删除

若要从数据库中删除表,请使用word drop。当您使用单词delete时,它意味着您希望从表中删除/删除内容(但希望表保持=继续存在于数据库中)

删除从其他表引用的行

如果表中有行(例如,表_x和id为1的行),并且该行是从其他表引用的(在其他表中,有外键链接到此条目),则不能按如下方式删除该行。你会得到一个错误

从id=1的表中删除;
错误:表“table_x”上的更新或删除违反了表“table_y”上的外键约束“constraint_name”
详细信息:键(id)=(1)仍然从表“table_y”引用。

错误的详细部分描述了原因。其他表中的条目引用此条目。例如,您可以想象表帐户和表帐户活动。从表帐户中删除条目(删除一个帐户)时,应删除表帐户活动中引用表帐户中此特定条目的所有条目。如果不是这样,您将以不涉及任何帐户的帐户活动结束

根据您想要实现的目标,有两种可能性:

  1. 您要删除整个表(表x)的内容和
    所有引用(外键)到此表的表
  2. 您希望从一个表中删除WHERE子句中指定的一个或多个条目(行),并删除引用该表的所有行
    条目/条目(如account和account_活动示例
    如上文所述)

1) 与级联关键字一起使用TRUNCATE

截断表\u x级联;

2) 将表_y中对列的约束更改为具有“删除级联”选项

更改表格
删除约束\u名称,
添加约束名称外键(表y中的列)
在删除级联上引用表_x(在表_x中引用列_);

删除其他表所依赖的表

当您有表格(例如表格x)且其他表格依赖于它时,您不能删除此表格。取决于表示其他表引用(具有外键)此表(表x)。当您试图删除这样的表时,会出现错误

放下桌子;
错误:无法删除表\u x,因为其他对象依赖它
详细信息:表格y上的约束id_x_fk取决于表格
提示:使用DROP。。。级联以删除从属对象。

这个错误给出了提示。当您想要删除这样一个表时,您必须使用带有级联关键字的drop。该表将被删除,引用该表的所有约束也将被删除

拖放表\u x级联;

示例

创建表x和表y

创建表格
(
id整数不为空,
文本字符变化(255)不为空,
约束表_x_pk主键(id)
);
创建表
(
id整数不为空,
文本字符变化(255)不为空,
id_x整数不为空,
约束表_y_pk主键(id)
);

在表_y中的列id_x上创建名为id_x_fk的约束

更改表格
添加约束id\u x\u fk外键(id\u x)
参考表_x(id);

将测试数据插入表x和表y

插入到表中\u x值
(1,‘超级x’),
(2,“大x”);
在表中插入y值
(一"y一",二),,
(2,'y 2',1),
(3,‘y三’,1);

从表_x中删除(错误)

从id=1的表中删除;

删除和添加具有相同名称的约束

更改表格
放置约束id_x_fk,
添加约束id\u x\u fk外键(id\u x)
参考删除级联上的表_x(id);

从表x和表y中删除(正确)

从id=1的表中删除;

删除表x和表y中的所有内容

截断表\u x级联;

删除(删除)表_x并删除表_y中的id_x_fk约束

拖放表\u x级联;

注意

如果表_x中有行(例如id=3),且该条目(该id)未从表_y中引用,则即使约束没有ON delete CASCADE选项(因为没有约束冲突),也可以删除该行

代码在PostgreSQL 92.4上进行了测试,Visual C++构建1600, 64位。

来源:

http://www.postgresql.org/docs/current/static/sql-droptable.html

http://www.postgresql.org/docs/current/static/sql-delete.html

http://www.postgresql.org/docs/current/static/ddl-constraints.html

http://www.postgresql.org/docs/current/static/sql-altertable.html

PostgreSQL删除所有内容

发表评论