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

Unique constraint across foreign keys in Sequelize model

我有一个与其他模型关联的简单 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 将生成 table 以及 idTrackIdUserIdisUpVote

我想在 TrackIdUserId 之间设置一个 UNIQUE 约束(即一个复合索引,确保给定的曲目和用户只有一个投票记录)。

如何做到这一点?

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

即:

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;
}

(^未测试,只是我的脑袋!)

问题是这只会在创建 table 时发生。如果您 table 已经存在,您可以使用 sequelize-cli 的迁移功能来实现。

我真的希望这至少能为您指明正确的方向。如果你仍然卡住了,我建议你去 IRC 频道进行续集,因为它似乎很活跃。

最终对我有用的是将它添加到 indexes 下,例如:

module.exports = function (sequelize, DataTypes) {
  var Votes = sequelize.define('Votes', {
    isUpVote: DataTypes.BOOLEAN,
  }, {
    indexes: [
      {
        unique: true,
        fields: ['TrackId', 'UserId'],
      },
    ],
    classMethods: {
      associate: function (models) {
        Votes.belongsTo(models.Track);
        Votes.belongsTo(models.User);
      },
    },
  });

  return Votes;
}