我在PostgreSQL 9.4中创建了很多具有外键的migrations.

这让人头疼,因为在迁移表时,它们必须按照外键所期望的顺序.如果我必须从我的新迁移所依赖的外键的其他包中运行迁移,它会变得更加棘手.

在MySQL中,我可以通过简单地在迁移文件的顶部添加SET FOREIGN_KEY_CHECKS = 0;来简化这一点.我如何在PostgresSQL中仅针对迁移代码的长度临时执行此操作?

顺便说一句,使用Laravel Schema Builder实现这一点.

推荐答案

PostgreSQL不支持任何配置选项,但还有另一种可能性.

postgres=# \d b
        Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │  Type   │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id     │ integer │           │
└────────┴─────────┴───────────┘
Foreign-key constraints:
    "b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE

Postgres中的引用完整性是通过触发器实现的,您可以在表上禁用触发器.使用这种方法,您可以上传任何数据(风险),但速度要快得多,因为对 Big Data 的判断非常昂贵.如果你的上传是安全的,那么你可以这样做.

BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;

下一种可能性是使用延迟约束.此移动约束判断用于提交时间.所以你不应该用INSERT条命令来遵守秩序:

ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;

BEGIN
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED;
SET CONSTRAINTS
postgres=# INSERT INTO b VALUES(100); -- this is not in a table
INSERT 0 1
postgres=# INSERT INTO b VALUES(10);
INSERT 0 1 
postgres=# COMMIT;
ERROR:  insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL:  Key (id)=(100) is not present in table "a".

您应该首选这种方法,因为插入的数据将被判断.

Postgresql相关问答推荐

Postgresql我必须创建一个索引还是已经有一个索引了?

正在应用序列化迁移,但数据库没有更改

使用PythonPolar在PostgreSQL中存储

PostgreSQL 连接字符串的正则表达式

在Power BI和Excel中将日期格式化为正确格式

使用doobie,如何将Scala case类映射到带有类型tstzmultirange的PostgreSQL列?

使用 GDB 调试器调试 AGE 代码的过程

联合所有 postgresql Select 子句保留顺序

用于生产的 Rails 性能调优?

Rails:创建删除表级联迁移

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

返回 NULL 的空数组的 array_length()

没有查询要创建的in ... error

如何增加 max_locks_per_transaction

Hibernate 启动很慢

PostgreSQL 表变量

Postgres 中有多少表分区太多了?

python postgres 我可以 fetchall() 100 万行吗?

postgresql DB中唯一键的正确数据类型是什么?

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环