Sequelize复合唯一约束

spe*_*eer 11 mysql node.js sequelize.js

定义模型:

export default function(sequelize, DataTypes) {
   return sequelize.define('Item', {
       minor: DataTypes.INTEGER,
       major: DataTypes.INTEGER,
   });
}
Run Code Online (Sandbox Code Playgroud)

我可以将minor和major对定义为复合UNIQUE约束吗?

Vik*_*kur 22

queryInterface.createTable('Item', {
    minor: {
        type: Sequelize.INTEGER,
    },
    major: {
        type: Sequelize.INTEGER,
    }
}, {
    uniqueKeys: {
        Items_unique: {
            fields: ['minor', 'major']
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


alo*_*d05 20

最近,在V4中,Sequelize将此添加到查询界面:

http://docs.sequelizejs.com/manual/tutorial/migrations.html#addconstraint-tablename-attributes-options-

queryInterface.addConstraint('Items', ['minor', 'major'], {
  type: 'unique',
  name: 'custom_unique_constraint_name'
});
Run Code Online (Sandbox Code Playgroud)

  • 以防万一有人对上面的评论感到困惑,由于@the-red-pea 的更新,它不再过时了 (5认同)
  • 现在已经过时了——将字段数组作为“options”对象中的“fields”传递。 (4认同)

Jak*_*ake 12

这是一个简单的答案:

major: { type: DataTypes.INTEGER, unique: 'compositeIndex'},
minor: { type: DataTypes.INTEGER, unique: 'compositeIndex'}
Run Code Online (Sandbox Code Playgroud)

来源:http://docs.sequelizejs.com/en/latest/docs/models-definition/

如果它是连接表,您还可以通过belongsToMany关联创建唯一约束:

Major = sequelize.define('major', {})
Minor = sequelize.define('minor', {})

Major.belongsToMany(Project)
Minor.belongsToMany(User)
Run Code Online (Sandbox Code Playgroud)

资料来源:http://docs.sequelizejs.com/en/v3/docs/associations/

就我而言,我希望找到一种方法来实现迁移.我通过在我的up函数结束时附加原始sql查询来完成此操作:

  up: function(queryInterface, Sequelize) {
return queryInterface.createTable('Item', {
  major: {
    allowNull: false,
    type: Sequelize.INTEGER
  },
  minor: {
    allowNull: false,
    type: Sequelize.INTEGER
  },
})
.then(function() {
  return queryInterface.sequelize.query(
    'ALTER TABLE `Item` ADD UNIQUE `unique_index`(`major`, `minor`)'
  );
});
Run Code Online (Sandbox Code Playgroud)

相关问题:

Sequelize,外键作为复合主键

Sequelize模型中外键的​​唯一约束


Chi*_*ere 8

我通过使用解决了这个问题addConstraint(...)

await queryInterface.addConstraint('Item', {
  fields: ['minor', 'major'],
  type: 'unique',
  name: 'unique_constraint_name'
});
Run Code Online (Sandbox Code Playgroud)

至少从 v6+ 开始。