【问题标题】:Unique constraint across foreign keys in Sequelize modelSequelize 模型中跨外键的唯一约束
【发布时间】:2015-06-15 14:41:47
【问题描述】:

我有一个与其他模型相关联的简单 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 将生成一个包含idTrackIdUserIdisUpVote 的表。

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

如何做到这一点?

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

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

    即:

    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频道看sequelize,好像很活跃。

    【讨论】:

    • 如何在 n:many 情况下在连接表上定义复合唯一索引?
    • 当我尝试时,它会抛出:SequelizeDatabaseError: foreign key constraint "event_related_info_<foreign name>_fkey" cannot be implemented
    • 如果我希望 TrackId 出现在 2 个不同的复合键中怎么办?例如 (TrackId, UserId), (TrackId, isUpVote)
    【解决方案2】:

    最终对我有用的是在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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2020-03-17
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多