sequelize – 无法添加外键约束

本教程将介绍sequelize - 无法添加外键约束的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

sequelize - 无法添加外键约束 教程 第1张

问题描述

我正在尝试在两个表之间设置 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 的外键关系约束

推荐答案

这是常见的类型错误,主要是因为

return sequelize.define('RefreshToken', {
 userId: {
type: DataTypes.INTEGER(11), // The data type defined here and 
references: {
  model: 'Users',
  key: 'idUsers'
}
 }, 


return sequelize.define('Users', {
 idUsers: {
type: DataTypes.INTEGER(11),  // This data type should be the same
 },

2.当引用的键不是主键或唯一键时.

你不能有两个主键,所以其他引用的键应该定义为唯一的.unique:true

 return sequelize.define('Users', {
 idUsers: {
primaryKey: true },
 mail: {
type: DataTypes.STRING(45),
allowNull: false,
primaryKey: true// You should change this to 'unique:true'. you cant hv two primary keys in one table. 
 }

好了关于sequelize - 无法添加外键约束的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。