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


我有一个简单的Sequelize模型,与其他模型相关联。

module.exports = function (sequelize, DataTypes) {
  var Votes = sequelize.define('Votes', {
    isUpVote: DataTypes.BOOLEAN
  }, {
    classMethods: {
      associate: function (models) {
        Votes.belongsTo(models.Track);
        Votes.belongsTo(models.User);
      }
    }
  });

  return Votes;
}

Sequelize将生成一个表格 idTrackIdUserId 和 isUpVote

我想设置一个 UNIQUE 约束 TrackId 和 UserId (即确保给定轨道和用户只有一个投票记录的综合索引)。

如何才能做到这一点?


12195
2018-04-10 01:38


起源



答案:


你可以使用唯一约束并给它一个字符串而不是一个bool。然后具有相同字符串的另一个其他字段将成为同一复合索引的一部分。

即:

module.exports = function (sequelize, DataTypes) {
   var Votes = sequelize.define('Votes', {
      isUpVote: {
          type: DataTypes.BOOLEAN,
          unique: 'myCompositeIndexName'
      },
      TrackId: {
          type: DataType.INTEGER
          unique: 'myCompositeIndexName',
      },
      UserId: {
          type: DataType.INTEGER
          unique: 'myCompositeIndexName',
      }
   }, {
       classMethods: {
           associate: function (models) {
               Votes.belongsTo(models.Track);
               Votes.belongsTo(models.User);
           }
       }
    });

    return Votes;
}

(^没有经过测试,只是在我头顶!)

这样做的问题是,这只会在创建表时发生。如果表已存在,则可以使用sequelize-cli的迁移功能实现此目的。

我真的希望这有助于其他方面至少指出你正确的方向。如果你仍然卡住了,我建议你去IRC频道进行续集,因为它看起来非常活跃。


10
2018-04-17 08:44



如何在n:多种情况下在连接表上定义复合唯一索引? - Tony Gutierrez


答案:


你可以使用唯一约束并给它一个字符串而不是一个bool。然后具有相同字符串的另一个其他字段将成为同一复合索引的一部分。

即:

module.exports = function (sequelize, DataTypes) {
   var Votes = sequelize.define('Votes', {
      isUpVote: {
          type: DataTypes.BOOLEAN,
          unique: 'myCompositeIndexName'
      },
      TrackId: {
          type: DataType.INTEGER
          unique: 'myCompositeIndexName',
      },
      UserId: {
          type: DataType.INTEGER
          unique: 'myCompositeIndexName',
      }
   }, {
       classMethods: {
           associate: function (models) {
               Votes.belongsTo(models.Track);
               Votes.belongsTo(models.User);
           }
       }
    });

    return Votes;
}

(^没有经过测试,只是在我头顶!)

这样做的问题是,这只会在创建表时发生。如果表已存在,则可以使用sequelize-cli的迁移功能实现此目的。

我真的希望这有助于其他方面至少指出你正确的方向。如果你仍然卡住了,我建议你去IRC频道进行续集,因为它看起来非常活跃。


10
2018-04-17 08:44



如何在n:多种情况下在连接表上定义复合唯一索引? - Tony Gutierrez