Rails ActiveRecord 迁移以添加带有“NOT VALID”参数的外键

Dav*_*mpy 1 activerecord ruby-on-rails foreign-keys

add_foreign_key 可以向 ALTER TABLE 命令添加“无效”参数吗?(Postgres,如果重要的话)

我在两个非常大的表之间有一个外键。我需要将 CASCADE DELETE 添加到密钥中。Postgres 似乎不支持将级联添加到现有的外键。解决方案是删除密钥,并使用级联添加新密钥。

很简单……除了检查约束需要很长时间。我不确定在该检查期间是否会发生任何锁定,但实际上,我只想跳过它。在我删除约束之前,数据是有效的……它稍后会有效。

Postgres 通过ALTER TABLE ADD CONSTRAINT ... NOT VALID. (这意味着“跳过验证”,即使听起来您说它无效。:耸肩:)

那么,我可以让 add_foreign_key 不进行验证吗?

Dav*_*mpy 6

RTFM:ActiveRecord::ConnectionAdapters::SchemaStatements#add_foreign_key

:证实

(仅限 Postgres)指定是否应验证约束。默认为真。

因此,要在不停机的情况下向现有外键约束添加级联删除:

remove_foreign_key :address, column: :user_id
add_foreign_key :address, :user_id, :users, on_delete: :cascade, validate: false
Run Code Online (Sandbox Code Playgroud)

我最初用 搜索了这个答案add_foreign_key "NOT VALID",我在文档、StackOverflow 等中没有找到有用的答案。希望这个问题和答案能帮助我在下次需要时再次找到这个答案。