CREATE UNIQUE INDEX test_good_default_goods ON test_good (good_id)
WHERE by_default = true
Это ограничение целостности, чтобы не отстрелить себе ногу.
Обновление:
Вместо
update test_good set by_default = true where id = :id
и какой-то фоновой магии, обновлять вот так:
update test_good set by_default = (id = :new_default_id) where good_id = :good_id
Если надо, uuid можно подзапросом по тому же самому :new_default_id вытащить.
Впрочем, возможно этот апдейт споткнётся на уникальном индексе, не помню точно, когда уникальность проверяется - для всего выражения или для каждой строки. Ну, можно будет переписать запрос. В конце концов, у нас ещё есть CTE.