带外键约束的Postgresql截断表

2024-09-30 03:24:50 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在尝试截断Postgresql 11.3上具有外键约束的表。在

我试过这么做

BEGIN; 
SET CONSTRAINTS ALL DEFERRED;
TRUNCATE tableA;
COMMIT;

但收到了错误

^{pr2}$

SET CONSTRAINTS ALL DEFERRED是否会关闭外键约束检查?有没有办法在不触发外键约束检查的情况下截断一个表,并且不涉及级联?在


Tags: postgresql错误情况all外键级联commitconstraints
2条回答

您可以执行以下步骤来避免截断期间的外键错误

  1. 创建删除所有外键和约束的自动脚本(不要运行它)

  2. 创建重新创建所有外键和约束的自动脚本

  3. 运行drop脚本

  4. 运行normal TRUNCATE your_table

  5. 运行“重新创建密钥”脚本

通过这些步骤,TRUNCATE命令运行良好,因为没有外键。在

删除和重新创建脚本来自https://blog.hagander.net/automatically-dropping-and-creating-constraints-131/

删除脚本:

SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";'
 FROM pg_constraint 
 INNER JOIN pg_class ON conrelid=pg_class.oid 
 INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace 
 ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname

重新创建脚本:

^{pr2}$

从一个表中删除所有数据

TRUNCATE TABLE语句的最简单形式如下:

TRUNCATE TABLE table_name;

从具有外键引用的表中删除所有数据

要从主表和所有对主表有外键引用的表中删除数据,请使用CASCADE选项,如下所示:

^{pr2}$

更新:

BEGIN;
ALTER TABLE table_name DISABLE TRIGGER ALL;
TRUNCATE TABLE table_name;
ALTER TABLE table_name ENABLE TRIGGER ALL;
COMMIT;

相关问题 更多 >

    热门问题