DEFAULT is not allowed in this context 错误

DEFAULT is not allowed in this context error

我正在尝试向数据库添加索引,但我一直收到错误消息:

PG::SyntaxError: ERROR: DEFAULT is not allowed in this context

阅读文档几个小时后,我似乎无法解决问题。

我是运行这个:

"CREATE UNIQUE INDEX index_uniq_service_models_default ON service_models(zone_id) WHERE default"

我的 table 看起来像这样:

create_table :service_models do |t|
  t.string :name, null: false
  t.jsonb :configuration, null: false, default: "{}"
  t.boolean :default, null: false
  t.json :metadata, null: false, default: "{}"
  t.references :zone, foreign_key: true, null: false, index: { name: idx_name(:service_models, :zones) }

  t.timestamps
end

我想要做的是让 ServiceModel 的一个区域只有 1 个默认值。

一个区域可以有多个 ServiceModel,但它只能有 1 个默认的。

What I want to do is for a ServiceModel to only have 1 default for a zone.

由于您使用的是 Rails,因此使用 validations 可能会更好。

class ServiceModel
  belongs_to :zone

  validates_uniqueness_of :zone, conditions: -> { where(default: true) }
end

可以将 where 子句添加到索引中,以创建仅包含匹配行的部分索引。但是 where default 不是有效的 where 子句,因为 default 是 SQL 关键字。由于 default 是 SQL 关键字,因此必须将其作为列引用。

create unique index service_models_default_zone_idx
  on service_models("zone_id")
  where "default"

或者在你的create_table块中...

t.index(:zone_id, unique: true, where: '"default"')

创建仅包含列 "default"true 的行的部分索引:

CREATE UNIQUE INDEX index_uniq_service_models_default ON service_models(zone_id)
WHERE "default";

default is a reserved word 用作标识符时必须是 double-quoted。

更好的是,不要使用保留字作为标识符开头。