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。
更好的是,不要使用保留字作为标识符开头。
我正在尝试向数据库添加索引,但我一直收到错误消息:
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。
更好的是,不要使用保留字作为标识符开头。