如何解决在此上下文错误中不允许使用DEFAULT
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"')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。