【发布时间】:2021-06-09 06:33:09
【问题描述】:
我正在使用 Sequelize 和 MySQL 作为数据库。
有两个表session和question_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 时,它显示了两个主键QuestionAnswerId 和sessionId。
如何解决?
【问题讨论】:
标签: mysql node.js sequelize.js