【发布时间】:2018-02-13 12:08:12
【问题描述】:
我正在尝试在两个表之间设置 1:1 的关系。 RefreshToken 表将有两个与 Users 表相关的 foreignKey,如下图所示:
我使用 sequelize-auto 来生成我的续集模型。
用户模型:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('Users', {
idUsers: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true
},
name: {
type: DataTypes.STRING(45),
allowNull: true
},
mail: {
type: DataTypes.STRING(45),
allowNull: false,
primaryKey: true
}
}, {
tableName: 'Users'
});
};
RefreshToken 模型:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('RefreshToken', {
idRefreshToken: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true
},
token: {
type: DataTypes.TEXT,
allowNull: true
},
userId: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true,
references: {
model: 'Users',
key: 'idUsers'
}
},
userEmail: {
type: DataTypes.STRING(45),
allowNull: false,
primaryKey: true,
references: {
model: 'Users',
key: 'mail'
}
}
}, {
tableName: 'RefreshToken'
});
};
当我运行应用程序时,我收到此错误:
未处理的拒绝错误:SequelizeDatabaseError: ER_CANNOT_ADD_FOREIGN:无法添加外键约束
我尝试添加明确的关系,在用户表中添加:
User.associate = (models) => {
User.hasOne(models.RefreshToken, {
foreignKey: 'userId'
});
User.hasOne(models.RefreshToken, {
foreignKey: 'userEmail'
});
};
在 RefreshToken 中:
RefreshToken.associate = (models) => {
RefreshToken.belongsTo(models.Users, {
foreignKey: 'userId'
});
RefreshToken.belongsTo(models.Users, {
foreignKey: 'userEmail'
});
};
但我再次收到同样的错误。如果我删除 RefreshToken 表中的引用,我看不到任何错误,但是当我检查数据库时,我看不到任何带有电子邮件和用户 ID 的外键关系约束
【问题讨论】:
-
尝试在 RefreshToken 表中仅使用
userid作为外键。 -
或者你应该使用复合外键:stackoverflow.com/questions/9780163/…
-
这里是 sequelize.js 不支持复合外键的信息:github.com/sequelize/sequelize/issues/311
标签: javascript mysql node.js express sequelize.js