sequelize + sequelize-hierarchy:如何在每个级别强制执行唯一的组织名称?

Posted

技术标签:

【中文标题】sequelize + sequelize-hierarchy:如何在每个级别强制执行唯一的组织名称?【英文标题】:sequelize + sequelize-hierarchy: How enforce a unique organization name per level? 【发布时间】:2015-09-04 18:32:00 【问题描述】:

我有一个组织树,并希望确保在树的同一级别(甚至在根级别)中只有一个组织(使用其nameparent_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 跟 原生sql相比 会太多的影响性能么

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

Sequelize.js 外键