我通过migrations.changeColumn功能在迁移中添加unique
约束。
添加约束有效,但由于您需要提供“向后迁移”,因此以相同方式删除它不会。在向后迁移时,它不会给出任何错误,但在Possibly unhandled SequelizeDatabaseError: relation "myAttribute_unique_idx" already exists
中再次应用正向迁移结果。
(使用过的数据库是postgres)
module.exports = {
up: function (migration, DataTypes, done) {
migration.changeColumn(
'Users',
'myAttribute',
{
type: DataTypes.STRING,
unique: true // ADDING constraint works
}
).done(done);
},
down: function (migration, DataTypes, done) {
migration.changeColumn(
'Users',
'myAttribute',
{
type: DataTypes.STRING,
unique: false // REMOVING does not
}
).done(done);
}
};
我也尝试过使用removeIndex
migration.removeIndex('Users', 'myAttribute_unique_idx').done(done);
但是在还原迁移时会出现以下错误:
Possibly unhandled SequelizeDatabaseError: cannot drop index "myAttribute_unique_idx" because constraint myAttribute_unique_idx on table "Users" requires it
答案 0 :(得分:23)
截至2017年,使用Sequelize 4.4.2,我们可以使用queryInterface API删除约束:
queryInterface.removeConstraint(tableName, constraintName)
文档为here。
答案 1 :(得分:5)
如果要删除索引,请使用:
down: function (migration, DataTypes) {
return migration.removeIndex('Users', 'myAttribute_unique_idx');
}
返回用于使用promise样式而不是回调。这是sequelize推荐的。
如下所示,自行处理索引的创建也是一件好事: http://sequelize.readthedocs.org/en/latest/docs/migrations/#addindextablename-attributes-options
答案 2 :(得分:4)
如果要删除约束,Sequelize具有removeConstraint()
方法。
因此,您可以使用类似以下的内容:
return queryInterface.removeConstraint('users', 'users_userId_key', {})
其中users
是我的表名,而users_userId_key
是索引或约束名,如果您要删除(例如)有唯一约束,则其格式通常为attributename_unique_key
。