Как определить уникальный индекс для нескольких столбцов в sequelize

Как определить уникальный индекс в комбинации столбцов в sequelize. Например, я хочу добавить уникальный индекс в user_id, count и name.

var Tag = sequelize.define('Tag', {
        id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        user_id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
        },
        count: {
            type: DataTypes.INTEGER(11),
            allowNull: true
        },
        name: {
            type: DataTypes.STRING,
            allowNull: true,
        })

Ответ 1

Вы можете обратиться к этому документу http://docs.sequelizejs.com/en/latest/docs/models-definition/#indexes

Вам нужно изменить определение, как показано ниже, и вызвать синхронизацию

var Tag = sequelize.define('Tag', {
    id: {
        type: DataTypes.INTEGER(11),
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
    },
    user_id: {
        type: DataTypes.INTEGER(11),
        allowNull: false,
    },
    count: {
        type: DataTypes.INTEGER(11),
        allowNull: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: true,
    }
},
{
    indexes: [
        {
            unique: true,
            fields: ['user_id', 'count', 'name']
        }
    ]
});

Ответ 2

У меня есть одна и та же проблема с примененным составным уникальным ограничением до нескольких столбцы, но ничего не работает с Mysql, Sequelize (4.10.2) и NodeJs 8.9.4 Наконец, я исправил следующий код.

queryInterface.createTable('actions', {
  id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true
  },
  system_id: {
      type: Sequelize.STRING,
      unique: 'actions_unique',
  },
  rule_id: {
      type: Sequelize.STRING,
      unique: 'actions_unique',
  },
  plan_id: {
      type: Sequelize.INTEGER,
      unique: 'actions_unique',
  }
}, {
  uniqueKeys: {
      actions_unique: {
          fields: ['system_id', 'rule_id', 'plan_id']
      }
  }
});

Ответ 3

Если принятый не работает, попробуйте следующий код. В моем случае это сработало, а не принятое.

var Tag = sequelize.define('Tag', {
    id: {
        type: DataTypes.INTEGER(11),
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
    },
    user_id: {
        type: DataTypes.INTEGER(11),
        allowNull: false,
        unique: 'uniqueTag',
    },
    count: {
        type: DataTypes.INTEGER(11),
        allowNull: true,
        unique: 'uniqueTag',
    },
    name: {
        type: DataTypes.STRING,
        allowNull: true,
        unique: 'uniqueTag',
    }
});

Ответ 4

Sequelize композитный уникальный (ручной)

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Model', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      fieldOne: {
        type: Sequelize.INTEGER,
        unique: 'uniqueTag',
        allowNull: false,
        references: {
          model: 'Model1',
          key: 'id'
        },
        onUpdate: 'cascade',
        onDelete: 'cascade'
      },
      fieldsTwo: {
        type: Sequelize.INTEGER,
        unique: 'uniqueTag',
        allowNull: false,
        references: {
          model: 'Model2',
          key: 'id'
        },
        onUpdate: 'cascade',
        onDelete: 'cascade'
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    })
    .then(function() {
      return queryInterface.sequelize.query(
        'ALTER TABLE 'UserFriends' ADD UNIQUE 'unique_index'('fieldOne', 'fieldTwo')'
      );
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Model');
  }
};