【问题标题】:Sequelize - "Multiple primary key defined" when defining N:M relationshipSequelize - 定义 N:M 关系时“定义了多个主键”
【发布时间】:2021-06-09 06:33:09
【问题描述】:

我正在使用 Sequelize 和 MySQL 作为数据库。

有两个表sessionquestion_answer是N对M的关系,所以我创建了一个联结表session_question_answer来连接它们。

发生错误:

{"code":"ER_MULTIPLE_PRI_KEY","errno":1068,"sqlState":"42000","sqlMessage":"Multiple primary key defined",
"sql":"ALTER TABLE `session_question_answer` ADD `questionAnswerId` CHAR(36) BINARY PRIMARY KEY, 
ADD CONSTRAINT `session_question_answer_questionAnswerId_foreign_idx` FOREIGN KEY (`questionAnswerId`) REFERENCES `question_answer` (`id`) 
ON DELETE CASCADE ON UPDATE CASCADE;"},"sql":"ALTER TABLE `session_question_answer` ADD `questionAnswerId` CHAR(36) BINARY PRIMARY KEY, 
ADD CONSTRAINT `session_question_answer_questionAnswerId_foreign_idx` 
FOREIGN KEY (`questionAnswerId`) REFERENCES `question_answer` (`id`) 
ON DELETE CASCADE ON UPDATE CASCADE;"}

不知道为什么会这样,因为我在 session_question_answer 中只有一个主键 id

session.model.js

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const session = sequelizeClient.define('session', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
    }
  }, {
    hooks: {
      beforeCount(options) {
        options.raw = true;
      }
    }
  });
  session.associate = function (models) {
    session.belongsToMany(models.question_answer, { as: 'question_answers', through: 'session_question_answer', foreignKey: 'sessionId', onDelete: 'cascade' })
  };

  return session;
};

question-answer.model.js

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const questionAnswer = sequelizeClient.define('question_answer', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
    }
  }, {
    hooks: {
      beforeCount(options) {
        options.raw = true;
      }
    }
  });

  questionAnswer.associate = function (models) {
    questionAnswer.belongsToMany(models.session, { as: 'sessions', through: 'session_question_answer', foreignKey: 'questionAnswerId', onDelete: 'cascade' })
  };

  return questionAnswer;
};

session-question-answer.model.js

const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const sessionQuestionAnswer = sequelizeClient.define('session_question_ans', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
    },
    sessionId: {
      allowNull: false,
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
    },
    questionAnswerId: {
      allowNull: false,
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
    }
  }, {
    hooks: {
      beforeCount(options) {
        options.raw = true;
      }
    },
    indexes: [
      { name: 'ix_session_q_ans', unique: true, fields: ['sessionId', 'questionAnswerId'] },
    ],
  });
  sessionQuestionAnswer.associate = function (models) {
  };
  return sessionQuestionAnswer;
};

编辑 1
当我运行show keys from session_question_answer 时,它显示了两个主键QuestionAnswerIdsessionId

如何解决?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    我将以下内容用于user / roles 关联以进行用户管理。您可以更改模型名称和属性以满足您的需要。有关模型关联的详细信息,请查看this section of the sequelize documentation

    user.js

    const { Model, DataTypes } = require('sequelize');
    
    module.exports = (sequelize) => {
    
      class User extends Model {
    
        static associate(models) {
          models.User.belongsToMany(models.Role, { through: models.RoleUser, as: 'roles', foreignKey: 'userId' });
        }
      };
    
      User.init({
        // Put your properties here...
      }, {
        sequelize,
        modelName: 'User'
      });
    
      return User;
    
    };
    

    角色.js

    const { Model, DataTypes } = require('sequelize');
    
    module.exports = (sequelize) => {
    
      class Role extends Model {
    
        static associate(models) {
          models.Role.belongsToMany(models.User, { through: models.RoleUser, as: 'users', foreignKey: 'roleId' });
        }
    
      };
    
      Role.init({
        // Put your properties here///
      }, {
        sequelize,
        modelName: 'Role',
      });
    
      return Role;
      
    };
    

    roleuser.js

    const { Model, DataTypes } = require('sequelize');
    
    module.exports = (sequelize) => {
    
      class RoleUser extends Model {
    
        static associate(models) {}
    
      };
    
      RoleUser.init({
        roleId: DataTypes.INTEGER,
        userId: DataTypes.INTEGER,
        createdAt: DataTypes.DATE,
        updatedAt: DataTypes.DATE
      }, {
        sequelize,
        modelName: 'RoleUser',
      });
    
      return RoleUser;
    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2018-07-11
      • 2020-05-10
      • 2020-05-22
      • 2019-03-16
      • 2021-05-01
      • 1970-01-01
      相关资源
      最近更新 更多