Ecto.Migrations.references/2 中的 on_delete 选项有什么作用?

vae*_*r-k 6 elixir ecto

外生文档介绍了可供选择references/2,但不记录哪些这些选项是做。可用的选项有:

  • :nothing
  • :delete_all
  • :nilify_all
  • :restrict

他们在做什么?

Jus*_*ood 7

这实际上是一个根本的 SQL 问题。

https://github.com/elixir-ecto/ecto_sql/blob/52f9d27a7ad86442f442bad2f7ebd19ba09ddc61/lib/ecto/adapters/myxql/connection.ex#L902-L905

PostgreSQL文档清晰地列出了这些选项:

  • :nothing- 如果在检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。
  • :delete_all - 指定当引用的行被删除时,引用它的行也应该被自动删除
  • :nilify_all-nil当引用行被删除时,导致引用行中的引用列被设置为
  • :restrict- 防止删除引用的行。如果有引用的对象,它将失败。

:nothing并且:restrict相似,但是:

这两个选择之间的本质区别在于 [ :nothing] 允许将检查推迟到事务的后期,而 [ :restrict] 则不允许。