sequelize + sequelize-hierarchy:如何在每个级别强制执行唯一的组织名称?
Posted
技术标签:
【中文标题】sequelize + sequelize-hierarchy:如何在每个级别强制执行唯一的组织名称?【英文标题】:sequelize + sequelize-hierarchy: How enforce a unique organization name per level? 【发布时间】:2015-09-04 18:32:00 【问题描述】:我有一个组织树,并希望确保在树的同一级别(甚至在根级别)中只有一个组织(使用其name
和parent_id
)。
例如:
有效树:
/org1 /org2
/org1/org2
/org3
无效树:
/org1
/org1
/org1/org2
/org2
型号:
var Organization = global.erp.orm.sequelize.define('Organization',
lodash.extend(, global.erp.orm.mixins.attributes,
name :
type : global.erp.orm.Sequelize.STRING,
comment : 'The organization short name (its common referred name).',
allowNull: false
),
comment : 'An organization.',
hierarchy: true
);
我尝试了以下方法,但没有任何结果:
comment : 'An organization.',
hierarchy: true,
indexes : [
unique: true,
fields: ['parent_id', 'name']
],
更新:
我将问题范围缩小到parent_id
为 NULL 时的情况,因此当其中一个值为 NULL 时,唯一复合索引似乎不起作用。
那么,有办法解决这个问题吗?
提前致谢。
【问题讨论】:
看看这个,不确定这是否正是你想要的,但看起来很相似 - ***.com/questions/26006724/… @Bulat 感谢您的评论。不,可悲的是,这不是我遇到的问题 :( 你能重新审视我对问题所做的更新的问题吗?谢谢! 您使用的是哪个数据库? @ezrepotein sqlite 和 mysql,但现在我正在测试 sqlite @diosney 这可能是您现在面临的问题:***.com/questions/22699409/sqlite-null-and-unique 吗? 【参考方案1】:这个问题的原因在于 sqlite 和 mysql 解释 SQL-92 标准的方式。他们将每个 NULL 值视为唯一的。这就是为什么具有相同值和 NULL 的行是可能的。
您可以在这里阅读更多内容:https://www.sqlite.org/lang_createindex.html
如果您想保留 NULL 值,则无法使用模型中的默认 sequelize 索引声明来解决此问题。
但是,您可以将这些字段声明为 NOT NULL,并提供您自己的默认“nullish”值,例如 0 或 -1。
【讨论】:
谢谢,很遗憾,我设置的外键不是为了唯一性,而是一个插件,所以我会与插件作者协商。再次感谢。【参考方案2】:仅使用复合索引的解决方案
虽然我已经将答案标记为已接受(并且我会保持这种状态,因为它为我指明了正确的方向,感谢@ezrepotein),我添加这个答案是为了完整性,因为这是我解决问题的方式.也许不是最好的解决方案,但它只使用唯一的复合索引,这是我想要的。
使用hierarchy_level
作为签入变量:
comment : 'An organization.',
hierarchy: true,
indexes : [
unique: true,
fields: ['name', 'hierarchy_level'],
where :
hierarchy_level: 1
,
unique: true,
fields: ['name', 'parent_id'],
where :
hierarchy_level:
$gt: 1
]
【讨论】:
以上是关于sequelize + sequelize-hierarchy:如何在每个级别强制执行唯一的组织名称?的主要内容,如果未能解决你的问题,请参考以下文章
同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)
Sequelize 和 MySQL 对照Sequelize 和 MySQL 对照
sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组