问题描述
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"
我的桌子看起来像这样:
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,default: "{}"
t.references :zone,foreign_key: true,index: { name: idx_name(:service_models,:zones) }
t.timestamps
end
我想要做的是让ServiceModel的区域仅具有1个默认值。
一个区域可以有许多ServiceModel,但是只能有1个默认模型。
解决方法
要创建仅包含列"default"
为true
的行的部分索引:
CREATE UNIQUE INDEX index_uniq_service_models_default ON service_models(zone_id)
WHERE "default";
default
is a reserved word,并且用作标识符时必须双引号。
更好的是,不要使用保留字作为标识符。
,我想要做的是让ServiceModel的区域仅具有1个默认值。
由于您使用的是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"')