How to change column to nullable with modify in Ecto migration

Article autor
September 9, 2025
How to change column to nullable with modify in Ecto migration
Elixir Newsletter
Join Elixir newsletter

Subscribe to receive Elixir news to your inbox every two weeks.

Oops! Something went wrong while submitting the form.

Table of contents

Sooner or later you'll have to change the null constraint in one of your DB relations. How to do it easily in Ecto?

Although I came across many different examples where a raw SQL has been used to perform this type of operation in Ecto, it's actually super easy to do it with modify/3 function.

Let's assume that your migration looks like this:

create table(:blog_posts) do
  add :title, :string, null: false
  add :intro, :text, null: false
  add :body, :text, null: false
  add :category_id, references(:blog_categories, on_delete: :delete_all)
end

... and at some point, you realize that you don't want to force passing the intro column value.

You can change it easily this way:

alter table(:blog_posts) do
  modify :intro, :text, null: true, from: :text
end

It's also worth mentioning that it's possible to modify foreign keys with modify:

alter table(:blog_posts) do
  modify :category_id,
    references(:blog_categories, on_delete: :delete_all),
    null: false,
    from: references(:blog_categories, on_delete: :delete_all)
end

Related posts

Dive deeper into this topic with these related posts

No items found.

You might also like

Discover more content from this category

How to check if an Elixir map has a given key in a guard?

Today's Advent of Code puzzle inspired me to create this TIL. It may sound trivial, but in fact, it's tricky if you are unfamiliar with the nuances of guards' functioning.

How to override Kernel macros

The macro mechanism in Elixir is not only an interesting metaprogramming feature - in fact, it is at the language's very core. And the more awesome fact is that, using macros, you can override the algorithm of defining functions itself!

Load CSS as string using JS & Webpack import prefixes

People will tell you it's an antipattern, but what if a library needs you to do this?