微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在此上下文错误中不允许使用DEFAULT

如何解决在此上下文错误中不允许使用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 举报,一经查实,本站将立刻删除。