mysql Sequelize -定义N:M关系时“定义多个主键”

c9qzyr3d  于 2023-11-16  发布在  Mysql
关注(0)|答案(1)|浏览(184)

我使用Sequelize和MySQL作为数据库。
有两个表sessionquestion_answer是N到M的关系,所以我创建了一个连接表session_question_answer来连接它们。
出现错误:

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

字符串
不知道为什么会发生这种情况,因为我在session_question_answer中只有一个主键id
session.model.js

  1. const Sequelize = require('sequelize');
  2. const DataTypes = Sequelize.DataTypes;
  3. module.exports = function (app) {
  4. const sequelizeClient = app.get('sequelizeClient');
  5. const session = sequelizeClient.define('session', {
  6. id: {
  7. allowNull: false,
  8. primaryKey: true,
  9. type: DataTypes.UUID,
  10. defaultValue: Sequelize.UUIDV4,
  11. }
  12. }, {
  13. hooks: {
  14. beforeCount(options) {
  15. options.raw = true;
  16. }
  17. }
  18. });
  19. session.associate = function (models) {
  20. session.belongsToMany(models.question_answer, { as: 'question_answers', through: 'session_question_answer', foreignKey: 'sessionId', onDelete: 'cascade' })
  21. };
  22. return session;
  23. };


question-answer.model.js

  1. const Sequelize = require('sequelize');
  2. const DataTypes = Sequelize.DataTypes;
  3. module.exports = function (app) {
  4. const sequelizeClient = app.get('sequelizeClient');
  5. const questionAnswer = sequelizeClient.define('question_answer', {
  6. id: {
  7. allowNull: false,
  8. primaryKey: true,
  9. type: DataTypes.UUID,
  10. defaultValue: Sequelize.UUIDV4,
  11. }
  12. }, {
  13. hooks: {
  14. beforeCount(options) {
  15. options.raw = true;
  16. }
  17. }
  18. });
  19. questionAnswer.associate = function (models) {
  20. questionAnswer.belongsToMany(models.session, { as: 'sessions', through: 'session_question_answer', foreignKey: 'questionAnswerId', onDelete: 'cascade' })
  21. };
  22. return questionAnswer;
  23. };


session-question-answer.model.js

  1. const Sequelize = require('sequelize');
  2. const DataTypes = Sequelize.DataTypes;
  3. module.exports = function (app) {
  4. const sequelizeClient = app.get('sequelizeClient');
  5. const sessionQuestionAnswer = sequelizeClient.define('session_question_ans', {
  6. id: {
  7. allowNull: false,
  8. primaryKey: true,
  9. type: DataTypes.UUID,
  10. defaultValue: Sequelize.UUIDV4,
  11. },
  12. sessionId: {
  13. allowNull: false,
  14. type: DataTypes.UUID,
  15. defaultValue: Sequelize.UUIDV4,
  16. },
  17. questionAnswerId: {
  18. allowNull: false,
  19. type: DataTypes.UUID,
  20. defaultValue: Sequelize.UUIDV4,
  21. }
  22. }, {
  23. hooks: {
  24. beforeCount(options) {
  25. options.raw = true;
  26. }
  27. },
  28. indexes: [
  29. { name: 'ix_session_q_ans', unique: true, fields: ['sessionId', 'questionAnswerId'] },
  30. ],
  31. });
  32. sessionQuestionAnswer.associate = function (models) {
  33. };
  34. return sessionQuestionAnswer;
  35. };

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

怎么修?

d5vmydt9

d5vmydt91#

我使用下面的方法来管理user/roles关联。您可以根据需要更改模型名称和属性。有关模型关联的详细信息,请查看this section of the sequelize documentation
user.js

  1. const { Model, DataTypes } = require('sequelize');
  2. module.exports = (sequelize) => {
  3. class User extends Model {
  4. static associate(models) {
  5. models.User.belongsToMany(models.Role, { through: models.RoleUser, as: 'roles', foreignKey: 'userId' });
  6. }
  7. };
  8. User.init({
  9. // Put your properties here...
  10. }, {
  11. sequelize,
  12. modelName: 'User'
  13. });
  14. return User;
  15. };

字符串
role.js

  1. const { Model, DataTypes } = require('sequelize');
  2. module.exports = (sequelize) => {
  3. class Role extends Model {
  4. static associate(models) {
  5. models.Role.belongsToMany(models.User, { through: models.RoleUser, as: 'users', foreignKey: 'roleId' });
  6. }
  7. };
  8. Role.init({
  9. // Put your properties here///
  10. }, {
  11. sequelize,
  12. modelName: 'Role',
  13. });
  14. return Role;
  15. };


roleuser.js

  1. const { Model, DataTypes } = require('sequelize');
  2. module.exports = (sequelize) => {
  3. class RoleUser extends Model {
  4. static associate(models) {}
  5. };
  6. RoleUser.init({
  7. roleId: DataTypes.INTEGER,
  8. userId: DataTypes.INTEGER,
  9. createdAt: DataTypes.DATE,
  10. updatedAt: DataTypes.DATE
  11. }, {
  12. sequelize,
  13. modelName: 'RoleUser',
  14. });
  15. return RoleUser;
  16. };

展开查看全部

相关问题